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を使ってそれぞれの値をチェックしているため、配列にして渡したとしても結果は同じになる
2019/12/13追記
配列で受け取るパラメータを追加しようとして少し詰まったため追記
ソースを読めば分かる事だったのだが、配列で受け取るパラメータの場合はハッシュで持っていないといけなかった
attributes = [:name, :password, { email: [] }]