wrap_paramerterとは
コントローラーの名前からリソースの名前を推測してリクエストパラメータをリソースの名前でラップする仕組みの設定を行います。
rails6.1までのrailsアプリケーションではrails new
した際にconfig/initializers/wrap_parameters.rb
というファイルが作成されます。
config/initializers/wrap_parameters.rb
# Be sure to restart your server when you modify this file.
# This file contains settings for ActionController::ParamsWrapper which
# is enabled by default.
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json]
end
# To enable root element in JSON for ActiveRecord objects.
# ActiveSupport.on_load(:active_record) do
# self.include_root_in_json = true
# end
やっている事
コントローラー名からモデル名を推測し、元のパラメーターをストロングパラメーターに対応させるようにモデル名でラップして新しいパラメーターを作ります。
'モデル名': {attributes}
例えば、コントローラーがUsersControllerの場合railsはコントローラーの名前からUserモデルがあると推測し、Userモデルのattributeを取得しattributesと同じ名前(=attribute_names
)のパラメータキーが渡ってきた場合にラップの対象にします。
user: { name:, email: }
設定方法
ラップパラメーターを使うかどうかは前述のconfig/initialisers/wrap_paramerter.rb
で可能です。デフォルトではリクエストのcontent_typeがjson場合はリクエストパラメーターをラップさせる様に設定されます。
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json]
end
または、コントローラー単位で個別で指定することも可能です。
class UsersController < ApplicationController
wrap_parameters format: [:json, :xml, :url_encoded_form, :multipart_form]
end