2012-07-22 40 views
0

我有这个在我的索引作用下控制器:类/对象预计

format.csv do 

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

end 

但是当我运行它,我得到:未定义的方法`to_csv”的#我可以;看不到我要去的地方错误?

的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

什么是你想用raise语句呢? – ramblex 2012-07-22 10:27:44

回答

1

Coaster.all返回一个不是异常类的数组。所以,当你试着去养它,你会得到你所看到

错误
+0

对不起,我完全发布了一段错误的代码。我已经用我最初想问的问题更新了我的问题!对不起大家! – rctneil 2012-07-22 13:28:07

3
的关系(范围) to_csv工作,

你的类的方法所以只写@coasters = Coaster.scoped代替@coasters = Coaster.all

format.csv do 

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

end 

说明:

您的方法to_csvself.一起声明,因此这是类方法。这种方法只能在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行与导轨3 ActiveRecord::Relation相关:link1link2。所有类的方法都可以在ActiveRecord::Relation对象上执行,但请记住Coaster.all返回对象数组,而不是关系。

Coaster.scoped返回的ActiveRecord ::所有对象的关系:http://apidock.com/rails/ActiveRecord/Scoping/Named/ClassMethods/scoped

+2

好的,请你再解释一下。我还没有完全理解它。为什么Coaster.all不工作? – rctneil 2012-07-22 16:32:21