什么是`params.require(:person).permit(:name,:age)`在Rails 4中做什么?

时间:2013-08-25 01:00:39

标签: ruby-on-rails-4

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

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

有人可以解释并解释requirepermit在这里发生的事情吗?

3 个答案:

答案 0 :(得分:170)

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

require方法确保存在特定参数,如果未提供,则require方法会引发错误。它会为传递到ActionController::Parameters的密钥返回require的实例。

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

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

答案 1 :(得分:3)

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 只允许某些标量通过过滤器,如上一个示例所示。关联数据的类型必须为 StringSymbolNilClassNumericTrueClassFalseClassDate、{ {1}}、TimeDateTimeStringIOIOActionDispatch::Http::UploadedFile。其他所有内容,包括 Rack::Test::UploadedFileArray 等容器,都将被过滤掉。

答案 2 :(得分:0)

更精确地说,当您创建例如。进行.new(...)时,必须有require指示的:person哈希,人员哈希将仅接受许可指示的:name:age

示例:

.new(person: { name: "Bhojendra", age: 32 }) // okay
.new(person: { name: "Rauniyar" }) // okay
.new(person: { name: "Bhojendra", other: 'asdf' }) // not okay
.new(person: { full_name: "Bhojendra Rauniyar" }) // not okay
.new(detail: { name: "Bhojendra", age: 32 }) // not okay, must be person