【问题标题】:What is `params.require(:person).permit(:name, :age)` doing in Rails 4?在 Rails 4 中,`params.require(:person).permit(:name, :age)` 是做什么的?
【发布时间】:2013-08-27 19:03:50
【问题描述】:

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

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

有人可以解构并解释requirepermit 发生的情况吗?

【问题讨论】:

  • 这个例子直接来自文档,解释了permit而不是require

标签: ruby-on-rails-4


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    更准确地说,当您为例如创建时。做.new(...),必须有require指示的:person hash,而person hash只接受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
    

    【讨论】:

    • 第三个和第四个not okay 示例可视化是什么?
    • @p0k8_ 我编辑了答案以澄清这一点。这些示例显示了一些未被“允许”的不同字段名称。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • permit 的描述有点不对劲:permit 返回另一个仅包含允许键的哈希值并且(这很关键)将以true 响应permitted? 方法。默认情况下,ActionController::Parameters 类的实例将返回falsepermitted? 响应truepermitted? 表示参数对象可以用于批量赋值;否则应用程序将抛出 ForbiddenAttributes 错误。
    • require 上链接permit 是否也允许并在返回的对象中包含所需的参数?
    • 我觉得命名很不幸,因为 require 不仅仅需要允许的参数。使用 params.permit(:person, :name, :age) 不起作用,并且会为典型表单生成诸如“Unpermitted parameters: :utf8”之类的错误。
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2014-01-28
    • 2021-11-15
    相关资源
    最近更新 更多