前置き
erbのセレクトボックス一つ一つにオプションの値を書いていると、見落としや編集の手間を感じたので1箇所に集めようと思った。
初めはhelperを使用していたが、同じ配列がバリデーションでも流用できるのではと思い今回の形になりました。
しかし、セキュリティの側面からみた場合、バリデーションで同じメソッドの値を使い回すこのやり方はどうなのか?という疑問が残ります。
また、バリデーションで流用するためにmodelにメソッドを定義しましたが、viewで表示するデータの作成は本来のmodelの役割ではない部分も意識する必要がありそうです。
環境
ruby: 2.7.1
rails: 6.0.2.2
コード
model
class Log < ApplicationRecord
# クラスメソッドの定義
class << self
def selectBoxOptions(key)
if key == "fruits"
return [ "なし", "りんご", "いちご"]
elsif key == "vegetables"
return [ "きゅうり", "とまと", "なす" ]
end
end
end
# バリデーションの作成。
validates :fruits, inclusion: { in: selectBoxOptions("fruits") }
validates :vegetables, inclusion: { in: selectBoxOptions("vegetables") }
end
view
<div class="field">
<%= f.label :speciality, "スペシャリティ" %>
<%= f.select :speciality, Log.selectBoxOptions("fruits") %>
</div>
<div class="field">
<%= f.label :entry_way, "エントリー方法" %>
<%= f.select :entry_way, Log.selectBoxOptions("vegetables") %>
</div>
後書き
enumを使用するという方法もあったのですが、それだけだとinputのvalueが数字になってしまうのでlocaleで日本語化する必要があったり、データベース保存は英語になるなどで今回実現したい内容には不向きなようでした。
[Rails] selectタグの選択肢の管理方法についてメリデメ比較をしてみる
【Rails】Enumってどんな子?使えるの?
なんやかんや方法はあるのでやりたいと思ったことはほぼ実現できますが、それが利にかなっているのか?正しい設計なのか?という部分は自分では判断しきれない部分が多々あり難しいですね。。。
もっと勉強しなければ!
参考
Railsのviewのパーシャルで、modelで定義したメソッドを利用すると発生するエラーを解消したい
Railsのモデルに書いたメソッドってどうやってコントローラで使うの?