rails로 csv를 출력할 때view로 성형하는 게 더 쉽잖아요?

6177 단어 Rails
rails로 csv를 출력하고 싶을 때가 있습니다.
어떤 방법으로 빠르게 검색해 봤는데 csv 생성은 컨트롤러에 직접 쓰거나 모델에 정의된 방법Model.to_csv(records)을 만들 수 있는 코드가 많았다.
하지만 csv는 html과 json처럼view로 쓰면 더 유창할 것 같아서 해봤어요.
app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all

    respond_to do |format|
      format.html do
        @users = @users.page params[:page]
      end
      format.csv do
        send_data render_to_string, filename: "users-#{Time.now.to_date.to_s}.csv", type: :csv
      end
    end
  end
end

app/views/users/index.csv.ruby
require 'csv' # initializersとかに書いたほうがいいかも

CSV.generate do |csv|
  cols = {
    'ID'     => ->(u){ u.id },
    '姓名'   => ->(u){ "#{u.last_name} #{u.first_name}" },
    '性別'   => ->(u){ u.sex },
    '誕生日' => ->(u){ u.birthday.strftime('%Y年%m月%d日') },
    '所持金' => ->(u){ number_to_currency u.money }
  }

  # header
  csv << cols.keys

  # body
  @users.each do |user|
    csv << cols.map{|k, col| col.call(user) }
  end
end

# csvダウンロードへのリンクはこんなかんじで
= link_to 'Download CSV', users_path(format: :csv)

view의 템플릿을 .ruby원본의 루비로 쓰고 controller 측면render_to_string에서 문자열로 send_data하여 응답 던지기.
controller 측format.csv도 괜찮지만 이번에는 파일 이름을 지정하고 싶어서 이렇게 됐습니다.
이번에는 표준 라이브러리CSV에 썼는데 템플릿은 원시적인 루비로 썼기 때문에 원하는 방식으로 쓸 수 있으면 좋지 않을까요.
그리고 다른 디스플레이 항목의 csv도 필요하다고 생각하면 뷰를 쓴 후에 액션이 증가하고 렌더의view도 분리되어 증가하기 쉬우며 모델로 직접 쓰는 것보다 전망이 좋습니다.
투고 후 같은 게 나왔어요.라는 것을 알아차렸지만 개의치 않았다

좋은 웹페이지 즐겨찾기