0

コントローラーの index アクションの下にこれがあります。

format.csv do

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

end

しかし、それを実行すると、次のようになります。

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

何かご意見は?

4

2 に答える 2

3

あなたのクラス メソッドto_csvは関係 (スコープ) で機能するので、@coasters = Coaster.scoped代わりに@coasters = Coaster.all次のように記述します。

format.csv do

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

end

説明:

あなたのメソッドto_csvはで宣言されてself.いるので、これはクラスメソッドです。このメソッドは、 object またはオブジェクトの配列ではなく、 Coaster classでのみ実行できます。

 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: link1link2。すべてのクラス メソッドはActiveRecord::Relationオブジェクトに対して実行できますがCoaster.all、リレーションではなくオブジェクトの配列を返すことに注意してください。

Coaster.scopedすべてのオブジェクトの ActiveRecord::Relation を返します: http://apidock.com/rails/ActiveRecord/Scoping/Named/ClassMethods/scoped

于 2012-07-22T13:39:02.310 に答える
1

Coaster.all例外クラスではない配列を返します。したがって、それを上げようとすると、表示されているエラーが発生します

于 2012-07-22T10:23:31.443 に答える