背景
この間仕事でとあるcsvの出力機能を作っている時にエラーが起きて思ったより解消に時間がかかったので、ちょっとメモっておきたいと思いました。このエラーは他の原因で起きることもあるようですが、参考となればと思います。
環境
Ruby 2.7.2
Rails 6.0.3.6
コード
通常のhtml表示と同じルートにしたいので、 respond_to
を使いました。
また、もともとransackを使ってフィルター機能を導入していて、csv出力の時もフィルタリングされた結果をベースに出力しています。
def index
@q = Book.ransack(search_params)
respond_to do |format|
format.html do
@books = @q.result.page(params[:page])
end
format.csv do
books = @q.result
redirect_to books_path, flash: { danger: '対象書籍がありません。' } if books.size === 0 and return
csv_data = OrderReportCsvGenerator.new(books).generate
send_data(csv_data, filename: "書籍一覧_#{Time.current.strftime('%Y%m%d_%H%M%S')}.csv", type: :csv)
end
end
end
問題点
上記のコードで実行してみたら、↓のエラーが起きて、すぐ問題点を気づいてくれる人もいらっしゃると思いますが、自分1人だと1時間ほどかかりました。。orz
Admin::BooksController#index is missing a template for this request format and variant. request.formats: ["text/csv"] request.variant: []
実はこちらの一行に問題がありました。
redirect_to books_path, flash: { danger: '対象書籍がありません。' } if books.size === 0 and return
解決
上記のコードを以下のように書き直せば解決しました。
return redirect_to books_path, flash: { danger: '対象書籍がありません。' } if books.size === 0