【问题标题】:Rails Csv.new where is this class being called from?Rails Csv.new 这个类是从哪里调用的?
【发布时间】:2014-02-27 19:05:10
【问题描述】:

我正在这里创建我自己版本的 Rayan Bates CSV 截屏视频...

http://railscasts.com/episodes/396-importing-csv-and-excel

我的模型中有这个...

 def self.open_spreadsheet(file)
    case File.extname(file.original_filename)
    when ".csv" then Csv.new(file.path, nil, :ignore)
    when ".xls" then Excel.new(file.path, nil, :ignore)
    when ".xlsx" then Excelx.new(file.path, nil, :ignore)
    else raise "Unknown file type: #{file.original_filename}"
    end
  end

...我的应用程序中出现此错误...

 NameError in StudentsController#import

uninitialized constant Student::Csv

Rails.root: /home/wintas/railsApps/t4
Application Trace | Framework Trace | Full Trace

app/models/student.rb:25:in `open_spreadsheet'
app/models/student.rb:13:in `import'
app/controllers/students_controller.rb:12:in `import'

我找不到类“Csv”的初始化位置,或者它应该来自哪里。任何帮助表示赞赏。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 roo-gem


    【解决方案1】:

    我相信自从 Railscast 发布以来,Roo 已经更新为 Roo 命名空间下的 CsvExcelExcelx 命名空间。试试这个:

    def self.open_spreadsheet(file)
      case File.extname(file.original_filename)
      when ".csv" then Roo::Csv.new(file.path, nil, :ignore)
      when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
      when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
      else raise "Unknown file type: #{file.original_filename}"
      end
    end
    

    【讨论】:

    • 感谢迪伦,这很有效。但它很奇怪。我使用的 Rails 版本和 gem 与 Ryan 的基础应用程序相同。
    • @Lumbee 但您使用的是相同版本的 gem 吗? Railscast 使用的是 1.10.1,而目前使用的是 1.13.2。
    • 使用 Roo::Csv 时仍然报错,请尝试使用 Roo::CSV。我希望这会有所帮助。
    【解决方案2】:

    使用 roo 1.13.2 的该功能的更新等效项是:

    def self.open_spreadsheet(file)
      case File.extname(file.original_filename)
        when ".csv" then Roo::CSV.new(file.path, file_warning: :ignore)
        when ".xls" then Roo::Excel.new(file.path, file_warning: :ignore)
        when ".xlsx" then Roo::Excelx.new(file.path, file_warning: :ignore)
        else raise "Unknown file type: #{file.original_filename}"
      end
    end
    

    【讨论】:

      【解决方案3】:

      在 ruby​​ 标准库中,csv 全部大写:CSV。这有帮助吗?

      【讨论】:

      • CsvRoo gem 中的一个类,不同于 Ruby 的 stdlib CSV 类。
      • 是的,我意识到,但在 Railscast 教程中,Ryan Bates 似乎是从 ruby​​ CSV 库开始的,所以我认为这可能是 OP 混淆的根源。无论如何,你可能是对的,它可能是一个需要命名空间的 gem 版本问题
      • 原来@PeterP 关于大小写是正确的,但原因不正确。请参阅 jesai 的答案,因为这对我来说是固定的。
      【解决方案4】:

      尝试重启服务器; 我之前遇到过这个问题,重启服务器解决了这个问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-31
        • 2019-11-18
        • 2018-09-25
        • 2014-10-23
        • 2021-12-14
        相关资源
        最近更新 更多