Strong parameters って Ruby の pattern matching で代替できんのか
params.require や params.permit が正直良いと思えないと言うか、
いやもちろん mass assignment 脆弱性対策が主ってことは知ってるんですが、
これを使うことが「入力を許して良いパラメータの一覧」をわかりやすくすることにちっとも貢献してないと前々から思っている(そういうのはあくまで Swagger とかが担保すべき、Strong Parameter の役割じゃないという考えもあるだろうが)。
ところで Ruby 2.7 にパターンマッチという機能があるんですが、これの代わりに、
code:ruby
def user_params
params.permit(:name, :type)
end
これではいかんのか?と思うことがある。少なくとも何が来るのか、来て良いのかが明確になった。
code:ruby
def user_params
case params
in { name: String, type: 'admin' } => admin_user_params
admin_user_params
in { name: String, type: 'normal' } => normal_user_params
normal_user_params
else
head :bad_request
end
end
この程度のパラメータならまぁ長いだけに感じられるとこだが、POST リクエストのある程度大きな params ならどうか。
code:ruby
def new_order_params
case params
in { line_items: *l, address: { post_code: _, prefecture: _ }, quantity: _ } => valid_params valid_params
else
head :bad_request
end
end
……と思ったけど、Hash の配列は困りそう(この書き方だと1要素しかないことになる)
code:ruby
in { line_items: quantity: _, product_id: _ } }