りんごとバナナとエンジニア

エンジニア修行の記録

【Rails】Strong Parametersにおけるrequireとpermitの違い

RailsでStrong Parametersを使ったパラメータの受け渡しをするとき、よく params.require(:task).permit(:title, :content)のように書く。このとき、requirepermitはどう異なり、なぜ両方使うのかがよくわからなかった。

公式にあたってみると、APIドキュメントに記載があった。

api.rubyonrails.org

requireはひとつのキーを指定し、そのキーに値があるか、あるいは値がfalseだった場合に、その値をそのまま返す。

一方permitは、特定のキーを指定し、そのkey-valueの組のパラメータだけを通す。返り値は ActionController:Parameter オブジェクトであり、同時に permitted フラグが true になる。
また、指定したキーの値がハッシュである場合は、そのハッシュの中のキーを個別に指定しなければpermitを通れない。

上のリンクの最後の例からもわかるように、やろうと思えばpermitのみで任意の組合せのパラメータを通すことができる。しかし、公式ドキュメントを含め、ほとんどのコード例では require で絞った後に permit でパラメータを通している。
RailsでのPOSTリクエストは、あるModelのインスタンスオブジェクトを追加・更新・削除するという処理がほとんどである。そのため、require でそのインスタンスオブジェクトに対応するキーのみに絞り、その中の各パラメータから必要なものを permit で選ぶというのがセオリーになっているようだ。
逆に、 require だけではパラメータを拾いきれない!という場合、Controller・Modelの設計がセオリーから外れている可能性がある。POSTリクエストで使うパラメータは、操作しようとしているインスタンスオブジェクトと何かしらの関係があるはずであり、それならばハッシュ形式にしてそれを一つのキーの値にすることができるはずだからだ。