我在索引操作下的控制器中有这个:
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
有什么想法吗?
答案 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::Relation
:link1,link2相关。所有类方法都可以在ActiveRecord::Relation
对象上执行,但请记住Coaster.all
返回对象数组,而不是关系。
Coaster.scoped
为所有对象返回ActiveRecord :: Relation:http://apidock.com/rails/ActiveRecord/Scoping/Named/ClassMethods/scoped
答案 1 :(得分:1)
Coaster.all
返回一个不是异常类的数组。所以,当你试图提高它时,你会得到你看到的错误