[Rails]params.fetchとparams.requireのち外

fetchはキーが存在せず第二引数で指定されたデフォルト値を返す。

第二引数の指定が無い場合はActionController::ParameterMissingエラーになる

なので、ストロングパラメーターの対象にデフォルト値を設定してエラーを出力したくない場合に使う。

requireはfetchのように第二引数でデフォルト値は指定できないのでキーが存在しなければエラーになる。

params = ActionController::Parameters.new(book: { title: 'test driven development' })

# fetch
params.fetch(:book)
# => #<ActionController::Parameters {"title"=>"test driven development"} permitted: false>
params.fetch(:none)
# => param is missing or the value is empty: none (ActionController::ParameterMissing)
params.fetch(:none, 'api design patterns')
# => "api design patterns"
params.fetch(:none) { 'api design patterns' }
# => "api design patterns"

# require
params.require(:none)
# => param is missing or the value is empty: none (ActionController::ParameterMissing)

[Rails]明示的に許可されていないパラメータが渡された場合にログ出力or例外にする設定

config/environments/xxx.rb に次の設定を追加する test環境とdevelopment環境のデフォルト値は :log、それ以外では false が設定される。

  • false: 何もしない
  • :log : ActiveSupport::Notifications.instrumentイベントをunpermitted_parameters.action_controllerで発火し、DEBUGレベルでログ出力する
  • :raise : ActionController::UnpermittedParameters例外をraiseする
config.action_controller.action_on_unpermitted_parameters = :raise

【参考】