Rails params.require vs params.fetch

Rails のStrong Parametersについて復習。

scaffold される controller が params.requireparams.fetch のパターンがある。

rails/controller.rb.tt at 10a2c77e901eb15b486f2c72fd9997bd0e2d506c · rails/rails

RailsのStrong Parametersを調べる - Qiita

params.require

params.require(:user).permit(:name, :email, recommend_book: [:user_id, :comment])

params.fetch

params.fetch(:user, {}).permit(:name, :email, :password)

userパラメータがなかったときはActionController::ParameterMissingのエラーが起きるようになっています。 上記の設定をしてあるとuserパラメータの代わりに{}がデフォルト値として評価されるようになります。

違うパラメータを許可しない

config.action_controller.action_on_unpermitted_parameters = :raise

Action Controller の概要 - Railsガイド

「paramsの値には許可されたスカラー値の配列を使わなければならない」ことを宣言するには、以下のようにキー1に空配列を対応付けます。

params.permit(id: [])

下記のように permit 省略でもかけるが気をつけるように。

ハッシュパラメータやその内部構造の正しいキーをすべて明示的に宣言できない場合や、すべて宣言するのが面倒な場合があります。次のように空のハッシュを割り当てることは一応可能です。

params.permit(preferences: {})

パラメータのハッシュ全体を許可したい場合は、permit!メソッドが使えます。

params.require(:log_entry).permit!