【Rails】Strong Parametersにおけるrequireとpermitの違い
RailsでStrong Parametersを使ったパラメータの受け渡しをするとき、よく params.require(:task).permit(:title, :content)
のように書く。このとき、require
と permit
はどう異なり、なぜ両方使うのかがよくわからなかった。
公式にあたってみると、APIドキュメントに記載があった。
requireはひとつのキーを指定し、そのキーに値があるか、あるいは値がfalseだった場合に、その値をそのまま返す。
一方permitは、特定のキーを指定し、そのkey-valueの組のパラメータだけを通す。返り値は ActionController:Parameter
オブジェクトであり、同時に permitted
フラグが true
になる。
また、指定したキーの値がハッシュである場合は、そのハッシュの中のキーを個別に指定しなければpermitを通れない。
上のリンクの最後の例からもわかるように、やろうと思えばpermitのみで任意の組合せのパラメータを通すことができる。しかし、公式ドキュメントを含め、ほとんどのコード例では require
で絞った後に permit
でパラメータを通している。
RailsでのPOSTリクエストは、あるModelのインスタンスオブジェクトを追加・更新・削除するという処理がほとんどである。そのため、require
でそのインスタンスオブジェクトに対応するキーのみに絞り、その中の各パラメータから必要なものを permit
で選ぶというのがセオリーになっているようだ。
逆に、 require
だけではパラメータを拾いきれない!という場合、Controller・Modelの設計がセオリーから外れている可能性がある。POSTリクエストで使うパラメータは、操作しようとしているインスタンスオブジェクトと何かしらの関係があるはずであり、それならばハッシュ形式にしてそれを一つのキーの値にすることができるはずだからだ。