期望的类/对象

时间:2012-07-22 10:07:36

标签: ruby-on-rails csv controllers

我在索引操作下的控制器中有这个:

format.csv do

    @coasters = Coaster.all
    render text: @coasters.to_csv

end

但是当我运行它时,我得到:未定义的方法`to_csv'用于#I我可以;看看我哪里出错了?

to_csv方法在这里:

def self.to_csv
    CSV.generate do |csv|
      csv << column_names
      all.each do |coaster|
        csv << coaster.attributes.values_at(*column_names)
      end
    end
  end

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您的类方法to_csv适用于关系(范围),因此只需编写@coasters = Coaster.scoped而不是@coasters = Coaster.all

format.csv do

    @coasters = Coaster.scoped
    render text: @coasters.to_csv

end

说明:

您的方法to_csv使用self.声明,因此这是类方法。此方法只能在Coaster 上执行,而不能在对象或对象数组上执行:

 Coaster.to_csv  #good
 Coaster.find(1).to_csv #error - Coaster object: undefined method 'to_csv'
 Coaster.where('id>5').to_csv #good
 Coaster.where('id>5').all.to_csv #error - return array of objects
 Coaster.all.to_csv #error

最后3行与Rails 3 ActiveRecord::Relationlink1link2相关。所有类方法都可以在ActiveRecord::Relation对象上执行,但请记住Coaster.all返回对象数组,而不是关系。

Coaster.scoped为所有对象返回ActiveRecord :: Relation:http://apidock.com/rails/ActiveRecord/Scoping/Named/ClassMethods/scoped

答案 1 :(得分:1)

Coaster.all返回一个不是异常类的数组。所以,当你试图提高它时,你会得到你看到的错误