質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

797閲覧

Rails で NoMethodError が出る

ItsukiN32

総合スコア13

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/10/12 15:18

app/models/task.rb

def self.csv_attributes ["name",'description', 'created_at', 'updated_at'] end def self.generate_csv CSV.generate(headers: true) do |csv| csv << csv_attributes all.each do |task| csv << csv_attributes.map{|attr| task.send(attr)} end end end

というメソッドを記入しています。
そして、app/controllers/tasks_controller.rbには

def index @q = current_user.tasks.ransack(params[:q]) @tasks = @q.result(distinct: true).reverse #.recent respond_to do |format| format.html format.csv { send_data @tasks.generate_csv , filename: "tasks-#{Time.zone.now.strftime('%Y%m%d%S')}.csv"} end end

があり、tasks.csvにアクセスされたときに、csvデータをエクスポートするようにしています。

しかし、 indexアクションを起動しても、

NoMethodError in TasksController#index undefined method `generate_csv' for #<Array:0x00007ffff42f67b8>

と表示され、
format.csv { send_data @tasks.generate_csv , filename: "tasks-#{Time.zone.now.strftime('%Y%m%d%S')}.csv"}
のgenerate_csvメソッドがないよと指摘してきます。

ちなみに、これは「現場で使える Ruby on Rails 5 速習実践ガイド」という本の一部のサンプルで、

https://book.mynavi.jp/files/user/support/9784839962227/chapter7_20181024.zip

にて完成データがダウンロードできます。
その完成データを解凍して起動すると、そちらではエラーは出ません。
上記の2つのファイルの記述部分を比較しても一言一句違わないのですが、なぜか自作した方だけエラーが発生してしまいます。

なにか原因で考えられることがあれば、ご指摘いただけましたら嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

速習実践ガイド は見ていないので、上がっているcodeだけ見ての、ですが
def self.generate_csv は Task のclassメソッドです

@tasks = @q.result(distinct: true).reverse の @tasksは Taskのリレーション、もしくはTaskのobjectの配列です。

ですので、@tasks.generate_csv はメソッドがないと言われた次第

generate_csvはall.eachになっているので全部出しちゃいますね。
選ばれたものをCSVにするなら、引数でデータを渡す様にするのが一つの手です。

投稿2019/10/12 22:26

winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問