今回railsのenumを利用した編集、詳細画面でのプルダウン表示を行いたかったので、その過程と実装について記載しています。
内容はrails学習して2ヶ月ほどの初学者が書いてますので、温かい目で見守って下さい。
今回やりたかったこと。。enumのプルダウン形式を利用したDBへの情報追加と、それの日本語表記対応まで
現在食品情報を投稿するアプリケーションを実装しています。
user情報の登録に際し、利用者の職業、性別、年代、といった情報を取り込みたかったのです。
よくサイト利用登録する時、プルダウンで選択できるサイトありますよね。僕のもあれらと同じにしたいと思いました。
enumを利用しない少しお手軽なやり方もあるようで、参考にさせてもらったのがこのサイト。
こちらの<%= f.select :sex, [["",""], ["女性","女性"], ["男性","男性"]], {}, class: 'form-control'
%>
を利用したやり方も良かったのですが、以前にenum利用が便利と言うことを誰かが言っていたのを思い出しました。
上記のも簡単ですが、勉強のため今回はenumを利用します。
enumを使うメリット
enumはカラムの中の項目に整数を割り当てて、メソッドを簡単に実行できるようになったり、可読性をあげることができるようになったりします。
以下がenumを使うメリットです。
・enumは、意味のない数値を隠して意味のある文字列やシンボルをプログラムコードでつかえるようにしてくれる
・enumを使うことで、可読性と安全性が上がる
・enumの定義はモデル内で行う
・enumはデータベースのカラムに保存される値に対して定義する
・enum定義することで、便利なメソッドが使えるようになる
・enumで定義した項目名は、「enum_help」(gem)を使うことで、簡単にi18n対応ができる
・i18nは、「Internationalization」の略=国際化
可読性と安全性が高まるというのがミソになるのですかね(;・∀・)
今回実装したコード記述
もうenum使って日本語化するんだと腹くくった方は、下記の日本語化のgemを入れましょう。
#gemfile gem 'enum_help'
そして
#ターミナル bundle install
「Bundle complete!」を含む節が表示されれば、enum_helpのインストールは完了です。
そして次に僕はmodelの設定を行いました。
#model/user.rb enum profession:[:profession_private, :unemployed, :worker, :housework] enum gender:[:gender_private, :man, :human] enum age_group:[:age_private, :Twenties, :thirties, :forties, :fifties, :sixties, :seventies, :eighties, :nineties]
ここでそれぞれの値を既に日本語表記で表示もできたのですが、最後のage_groupのところの20代、30代として表示させようとすると構文エラーとなったため断念。
それにしっかりとした手順で日本語変換にするのが勉強にもなりますねw
次にviewでf.selectを使い表示していきました。
#view/user/edit.html.erb <%= form_for(@user, url: users_user_path ) do |f| %><%= f.label :職業 %> <%= f.select :profession, User.professions.keys.map {|k| [I18n.t("enums.user.profession.#{k}"), k]} %> <%= f.label :性別 %> <%= f.select :gender, User.genders.keys.map {|k| [I18n.t("enums.user.gender.#{k}"), k]} %> <%= f.label :年代 %> <%= f.select :age_group, User.age_groups.keys.map {|k| [I18n.t("enums.user.age_group.#{k}"), k]} %>
#view/user/show.html.erb <%= @user.profession_i18n %> <%= @user.gender_i18n %> <%= @user.age_group_i18n %>
おそらく
<%= f.select :profession, User.professions.keys.map {|k| [I18n.t(“enums.user.profession.#{k}”), k]} %>
ここらへんの記述が?となると思います。
showページはなんとなくわかると思います。_i18nは語尾につけとかないと日本語化できないです。
editはもう少し簡単にコード表記できないものかと試行錯誤したのですが、一筋縄では行かなかったです。説明が難しいため、書き方の理解が難しいという方はこちら参考にしてみて下さい。

次にlocaleファイルをいじります。
localeファイルは、翻訳用ファイルです。
実際には、enumに定義する項目名に対応した日本語を設定するファイルです。そのため、項目数と同じだけの翻訳情報を登録しておく必要があります。
テキストエディタなどで、以下のファイルを作成し、「ja.yml」というファイル名で、「config/locales/」に格納してください。
そして今回の記述はこんな感じです。
#config/locales/ja.yml ja: enums: user: profession: profession_private: 非公開 unemployed: 無職 worker: 在職 housework: 専業主婦(主夫) gender: gender_private: 非公開 man: 男性 human: 女性 age_group: age_private: 非公開 twenties: 20代 thirties: 30代 forties: 40代 fifties: 50代 sixties: 60代 seventies: 70代 eighties: 80代 nineties: 90代
非公開はお好みで良いと思いますが、情報を隠されたい方もいるかも知れないので。
最後に仕上げにかかります。
準備の最終段階は、言語(locale)設定です。
なにも設定しなければ、言語は英語になっているため、それを日本語に変更してやります。
「config/application.rb」のApplicationクラス内に、以下を追記します。
config.i18n.default_locale = :ja
「:ja」が、先ほど作ったja.ymlファイルを表しています。
これでなんとか日本語化までいけてるのでは無いかと思います。
けっこう簡単に記述していますが、ここまで実装するのに3時間ほどかかりました。
同じように作られる方の参考になればなと思います。
また、記述書いて、実装はできたけど今ひとつ理解に苦しむと言う方は下記も目を通したほうが良いです。
かなり考え方の参考になりましたので。。。それでは今度こそまたね(^_^)/~
コメント