セレクトボックスでデータを保存する際、値でなくキーで保存する方法を紹介します。
キーで保存するメリット
・セレクトボックスの表示を変えたい場合、データベースに登録しているレコードの値を変更する必要がありません。
・日本語のデータを保存する際に、keyを日本語にする必要がありません(コードの見た目の問題)
やりかた
invert
メソッドを使います。ハッシュのkey
とvalue
が逆転します。
selectbox.rb
<%= form_with url: users_path do |f| %>
<%= f.select :fruit, { a: "りんご", b: "みかん" }.invert %>
<%= f.submit "保存" %>
<% end %>
invert
を使った上記コードの場合、
・ブラウザに表示されるのは、「りんご」「みかん」
・保存されるのは、「a」「b」です。
もし、セレクトボックスの表示を変えたくなったら
selectbox.rb
<%= form_with url: users_path do |f| %>
<%= f.select :fruit, { a: "ぶどう", b: "もも" }.invert %>
<%= f.submit "保存" %>
<% end %>
上記のようにすればOKです。
既存のレコードの値を変える必要がなく管理が楽になります
以上です。
記事を書いた背景
キー(key)を日本語で書くのは、エンジニアの中には違和感を持つ方もおられるそうです。
そのため、下記のようなコードは控えたほうがいいそうです。
selectbox.rb
<%= form_with url: users_path do |f| %>
<%= f.select :fruit, { りんご: "りんご", みかん: "みかん" } %>
<%= f.submit "保存" %>
<% end %>
もちろんこのままでも正常に動きますけどね
ただ、そうなるとセレクトボックスの表示が英語になってしまうんですよね。
selectbox.rb
<%= form_with url: users_path do |f| %>
<%= f.select :fruit, { a: "りんご", b: "みかん" } %>
<%= f.submit "保存" %>
<% end %>
これでは困るということで、invert
メソッドを使ったわけです。
開発環境
Ruby: 2.7.1
Rails: 6.0.0.3