Rails 4 文档中所有强参数的示例都使用
params.require(:person).permit(:name, :age)
require
有人可以解构并解释permit
这里发生了什么吗?
Rails 4 文档中所有强参数的示例都使用
params.require(:person).permit(:name, :age)
require
有人可以解构并解释permit
这里发生了什么吗?
控制器中的params
看起来像一个 Hash,但它实际上是 的一个实例ActionController::Parameters
,它提供了几个方法,例如require
和permit
。
该require
方法确保存在特定参数,如果未提供,该require
方法将引发错误。ActionController::Parameters
它返回传递给 的键的实例require
。
该permit
方法返回参数对象的副本,仅返回允许的键和值。当创建一个新的 ActiveRecord 模型时,只有允许的属性被传递到模型中。
它看起来很像以前包含在 ActiveRecord 模型中的白名单,但将它放在控制器中更有意义。
更准确地说,当您为例如创建时。这样做.new(...)
时,必须有:person
require 指示的哈希,而 person 哈希只会接受:name
并由:age
permit 指示。
例子:
.new(person: { name: "Bhojendra", age: 32 }) // okay
.new(person: { name: "Rauniyar" }) // okay
.new(person: { name: "Bhojendra", other: 'asdf' }) // not okay, other not permitted
.new(person: { full_name: "Bhojendra Rauniyar" }) // not okay, full_name not permitted
.new(detail: { name: "Bhojendra", age: 32 }) // not okay, must be person
将require
其视为验证和permit
过滤。
require
如果存在,将返回给定键下的参数,或者 raisepermit
将返回在给定键上过滤的参数*基于 https://apidock.com/rails/ActionController/Parameters/permit的示例
>> params = ActionController::Parameters.new(user: { name: "Francesco", age: 22, role: "admin" })
{
"user" => {
"name" => "Francesco",
"age" => 22,
"role" => "admin"
}
}
>> params.require(:user).permit(:name, :age)
Unpermitted parameter: role
{
"name" => "Francesco",
"age" => 22
}
>> params.require(:user)
{
"name" => "Francesco",
"age" => 22,
"role" => "admin"
}
>> params.require(:user).permit(:foo)
Unpermitted parameters: name, age, role
{}
>> params.require(:person)
ActionController::ParameterMissing: param is missing or the value is empty: person
>> params.permit(:user)
Unpermitted parameter: user
{}
* 请注意,permit
仅允许某些标量通过过滤器,如上一个示例所示。关联数据的类型必须为String
, Symbol
, NilClass
, Numeric
, TrueClass
, FalseClass
, Date
, Time
, DateTime
, StringIO
, IO
,ActionDispatch::Http::UploadedFile
或Rack::Test::UploadedFile
。其他所有内容,包括 和 之类的容器Array
,都会Hash
被过滤掉。