在 Rails 4中,‘ params.need (: person) . 許可(: name,: age)’的作用是什么?

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

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

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

130570 次浏览

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

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

permit方法返回参数对象的副本,只返回允许的键和值。当创建一个新的 ActiveRecord 模型时,只有允许的属性被传递到模型中。

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

更准确地说,当您创建例如执行 .new(...)时,必须有由请求指示的 :person哈希,而人哈希将只接受由许可证指示的 :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

可以将 require视为验证,将 permit视为过滤。

  • 如果存在,require将返回给定键下的参数,或者引发
  • 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只允许某些标量通过过滤器,如上例所示。相关数据必须是类型 StringSymbolNilClassNumericTrueClassFalseClassDateTimeDateTimeString0,String1,String2或 String3。其他的一切,包括像 String4和 String5这样的容器,都被过滤掉了。