LoginSignup
0
1

More than 3 years have passed since last update.

Railsでpermitの引数に入れる値を条件によって変える

Last updated at Posted at 2019-09-17

permitに渡す引数の値を条件によって変えたい、お作法的に正しいかは分からないが、そんな場面が出てきたので、paramsのメソッドを複数作ったり、複数用意したpermitをメソッド内で分岐する以外のやり方がないか考えたメモ。

permitに渡す用に配列を用意して、それをいじくるのが無難かなというところに落ち着いた。
イメージとしては以下のような感じで、共通のパラメータは最初から入れておいて、ifで必要な分を追加する。(パラメータは適当)

def user_params
  attributes = [:name, :password]
  attributes.push(:role, :parent_user) if current_admin_user?
  params.require(:user).permit(attributes)
end

permitのソースを読むと、

def permit(*filters)
  params = self.class.new
  filters.flatten.each do |filter|
(省略)

引数(filters)は可変長引数(引数を配列にして受け取る)になっている。
その上で、flattenを使ってからeachを使ってそれぞれの値をチェックしているため、配列にして渡したとしても結果は同じになる

ソース引用元:https://github.com/rails/rails/blob/66cabeda2c46c582d19738e1318be8d59584cc5b/actionpack/lib/action_controller/metal/strong_parameters.rb#L543


2019/12/13追記
配列で受け取るパラメータを追加しようとして少し詰まったため追記

ソースを読めば分かる事だったのだが、配列で受け取るパラメータの場合はハッシュで持っていないといけなかった

attributes = [:name, :password, { email: [] }]
0
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
0
1