検索結果をCSV出力する

検索した結果をViewをつかってCSV出力する方法です。

環境

実装

Controller

index.csvで呼ばれた場合に、CSVを出力するようにします。

def index
  @alls = Item.all
  @items = @alls.page(params[:page]) 

  respond_to do |format|
    format.html
    format.csv do
      send_data render_to_string, filename: "item-#{Time.now.strftime("%Y%m%d")}.csv", type: :csv
    end
  end
end
View
require "csv"
require "nkf"

csv_data = CSV.generate(force_quotes: true) do |csv|

  csv << %w(ID コード 名前)
  
  @alls.each do |item|
    row = []
    row << item.id
    row << item.try(:code)
    row << item.try(:name)
    csv << row
  end
end

NKF::nkf('--sjis -Lw', csv_data)
  • 呼び出し元 (index.html.erb)
    検索もCSV出力もsubmitで実行するために、こんな呼び出し方にしています。
<%= form_tag '', name: 'search_form', method: :GET do %>
  # 検索
  <button type="submit">
    <i class="fa fa-search"></i>
  </button>

  # CSV出力
  <button type="submit" name="format" value="csv">
    <i class="fa fa-download"></i>
  </button>
<% end %>

参考

railsでcsv出力する時はviewで整形したほうがわかりやすくない? - Qiita