LoginSignup
1
1

More than 3 years have passed since last update.

【Rails】一つのメソッドをf.selectのオプションとバリデーションで使い回す

Posted at

前置き

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のモデルに書いたメソッドってどうやってコントローラで使うの?

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1