迷い人

日々勉強。勉強の先に何か見つかるといいなぁ

【rails】CSVファイルのダウンロード

railsCSVファイルのダウンロード機能を実装したので紹介します。

 

まず基本的な実装は以下のサイトのそのまま参考にしています。

 

https://tisnote.com/ruby-on-rails-csv/

 

index.csv.rubyをview/index.html.hamlと同じフォルダに作成する。

 

CSV.generate do |csv|
  csv_column_names = %w(title content name)
  csv << csv_column_names
  @questions.each do |question|
    csv_column_values = [
      question.title,
      question.content,
      question.user.name
    ]
    csv << csv_column_values
  end
end
次にindex.html.hamlに以下のリンクを追記。
%form{action: questions_path(format: :csv), method: "get"}
  %input{type: "submit", value: "csv出力"}
ポイントはquestion_path(format: :csv)の部分です。このように記述することでindexメソッドにcsv形式のフォーマットを送ることができます。
受け取るquestions_controller.rbのindexメソッドは以下のようにします。
def index
  @questions = Question.all
  respond_to do |format|
    format.html
    format.csv { send_data render_to_string, type: :csv, filename: "questions_category.csv" }
  end
end
csvフォーマット場合、render_to_stringとすることで出力結果すなわち@questionsをブラウザに返さず、文字列だけを返します。また出力するcsvのファイル名も指定しています。
ちなみに
format.csv send_data render_to_string, type: :csv, filename: "questions_category.csv" 
だとエラーが出たので{ }でくくっています。
さて、これで全てのquestionがcsvで出力されます。とても簡単ですね。
次回はこの機能をベースに特定のカテゴリに属するquestionのみ出力する方法を紹介します。