“params.require(:person)permit(:name,:age)”在Rails4中做什么



Rails 4文档中所有强参数的例子都使用

params.require(:person).permit(:name, :age)

有人能解构并解释一下requirepermit在这里发生了什么吗?

控制器中的params看起来像Hash,但它实际上是ActionController::Parameters的一个实例,它提供了requirepermit等几种方法。

require方法确保存在特定的参数,如果没有提供,require方法将抛出错误。它为传递到require中的密钥返回一个ActionController::Parameters的实例。

permit方法返回parameters对象的副本,只返回允许的键和值。创建新的ActiveRecord模型时,只有允许的属性才会传递到模型中。

它看起来很像以前包含在ActiveRecord模型中的白名单,但它在控制器中更有意义。

require视为验证,将permit视为筛选。

  • require将返回给定密钥下的params(如果存在),或引发
  • permit将返回在给定密钥上过滤的参数*

示例基于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只允许某些标量通过滤波器,如上一个示例所示。关联数据的类型必须为StringSymbolNilClassNumericTrueClassFalseClassDateTimeDateTimeStringIOIOActionDispatch::Http::UploadedFileRack::Test::UploadedFile。其他所有东西,包括像ArrayHash这样的容器,都会被过滤掉。

更准确地说,当您创建例如执行.new(...)时,必须有由require指示的:person哈希,而person哈希将只接受由permit指示的:name:age

示例:

.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

相关内容

最新更新