enumとは
railsの場合は標準機能としてモデルに記述することで使うことができる。
セレクトボックスから選ばせた値をDBに保存する時などに便利
わざわざDBにテーブルを作って保存しておくほどではない静的なデータも
ユーザーに任意の値を入力させたり、いくつもセレクトのオプションを作ったりするよりも
enumで数値に変換させてDBに保存させることで、保存される値を限定的に保つことができる。
モデルに記述
gemをインストール
ymlを作成
app/config/locals/にja.ymlを作成
ja.ymlを読み込み
app/config/apprcation.rb
ビューで呼び出す
今回はセレクトボックスを使いました(form_for内、hamlで使用)
enumとセレクトボックスは併用することが多くなると思います
= f.select :size, Item.sizes_i18n.invert, {prompt: "---"}, {class: "select__box__format"}
分かりやすく分解すると以下
= f.select :カラム, Item.sizes_i18n.invert, {selectオプション}, {htmlオプション}
セレクトボックスの詳しい解説は以下が分りやすかったです
ビューで呼び出す
今回はセレクトボックスを使いました(form_for内、hamlで使用)
enumとセレクトボックスは併用することが多くなると思います
= f.select :size, Item.sizes_i18n.invert, {prompt: "---"}, {class: "select__box__format"}
分かりやすく分解すると以下
= f.select :カラム, Item.sizes_i18n.invert, {selectオプション}, {htmlオプション}
Item.sizes_i18n.invertをもう少し分解
Item.sizes
enumを使用するとRailsのItem.newのようにインスタンスとして扱うことができるので
Item.sizesとするとItemモデルで定義したsizeのenum全部を呼び出すことができる
コンソール
[1] pry(main)> Item.sizes
Creating scope :included. Overwriting existing method Post.included.
=> {"small"=>0, "middle"=>1, "large"=>2}
_i18n
これは簡単。日本語化してるだけ
コンソール
[2] pry(main)> Item.sizes_i18n
=> {"small"=>"Sサイズ", "middle"=>"Mサイズ", "large"=>"Lサイズ"}
.invert
[3] pry(main)> Item.sizes_i18n.invert
=> {"Sサイズ"=>"small", "Mサイズ"=>"middle", "Lサイズ"=>"large"}
ここでf.selectに戻る
なんでinvertでキーとバリューを逆にする必要があるのかという話は
f.selectの引数に起因する。
f.selectの引数は以下
= f.select :カラム, ["表示名","DBに保存する値"], {selectオプション}, {htmlオプション}
第一引数に保存先のカラム、第二引数にセレクトボックスで表示させる値たち
を指定する。
[3] pry(main)> Item.sizes_i18n.invert
=> {"Sサイズ"=>"small", "Mサイズ"=>"middle", "Lサイズ"=>"large"}