23186


Ruby on Railsでユーザーの名前等と、ステータスをダウンロードできるようにしようと考えています。  
ステータスはenumで定義しており、現時点ではダウンロードするとenumのキーがそのまま表示されてしまいます。  
このステータスをenumのキーに応じて日本語に変換し表示したいと考えてますが、ステータス列はenumで定義しているため別の値（日本語）を代入することができず、悩んでおります。

何か対応策がございましたら、ご教授頂けますと幸いです。  
下記、詳細となります。

* * *

# モデル

[code]

    class Applicant < ActiveRecord::Base
      belongs_to :target
      belongs_to :user
      has_one :event, through: :target
    
      enum status: {default: nil, confirmed: 1, waiting: 2,canceled: 3}
    end
    
[/code]

* * *

# list_download.csv.ruby

[code]

    require 'csv'
    require 'nkf'
    
    csv_str = CSV.generate do |csv|
      cols = {
        Target.human_attribute_name(:name)           => ->(s){ s.target.name },
        Applicant.human_attribute_name(:status)      => ->(s){ s.status },
        User.human_attribute_name(:user_name)        => ->(s){ s.user.user_name },
        User.human_attribute_name(:name)             => ->(s){ s.user.name },
        Applicant.human_attribute_name(:comment)     => ->(s){ s.comment },
      }
    
      # header の追加
      csv << cols.keys
    
      # body の追加
      @applicants.each do |applicant|
        #下記のように、日本語表記に変換したいと考えています。
        # case applicant.status
        # when "confirmed" then
        #   applicant.status = "参加確定"
        # when "waiting" then
        #   applicant.status = "キャンセル待ち"
        # when "canceled"
        #   applicant.status = "キャンセル"
        # end
        csv << cols.map{|k, col| col.call(applicant) }
      end
    end
    # 文字コード変換
    NKF::nkf('--sjis -Lw', csv_str)
    
[/code]

* * *

# list_download.csv

[code]

    応募枠,参加可否,ユーザー名,名前,コメント
    参加枠1,confirmed,aaa,佐藤たろう,参加します。
    
[/code]

* * *

また下記のサイトを参考にさせていただきました。  
[Rails で CSV ファイルを View
を使って生成する](http://qiita.com/yutackall/items/24a4487f629a9106a971)

よろしくお願い致します


CC BY-SA 3.0
2016-03-13T04:33:35.937
23078
2016-03-16T05:53:16.510
2020-06-17T08:14:45.997
-1
12734
question
ruby-on-rails ruby csv
CSVダウンロード時に、enumの表記を変更する方法について


以下のように`i18n`を利用してみてはいかがでしょうか？

## list_download.csv.ruby

[code]

    require 'csv'
    
    CSV.generate do |csv|
      cols = {
        Applicant.human_attribute_name(:status) => ->(s){ t("enums.applicant.status.#{s.status}") }
      }
      csv << cols.keys
    
      @applicants.each do |applicant|
        csv << cols.map{|k, col| col.call(applicant) }
      end
    end
    
[/code]

## ja.yml

[code]

    ja:
      activerecord:
        attributes:
          applicant:
            status: ステータス
      enums:
        applicant:
          status:
            default: デフォルト
            confirmed: 確認済み
            waiting: 待機中
            canceled: キャンセル
    
[/code]


CC BY-SA 3.0
2016-03-16T05:53:16.510
23186
2016-03-16T05:53:16.510
2646
23078
answer