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

Posted

技术标签:

【中文标题】在 Rails 4 中,`params.require(:person).permit(:name, :age)` 是做啥的?【英文标题】: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 【参考方案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”之类的错误。

以上是关于在 Rails 4 中,`params.require(:person).permit(:name, :age)` 是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Rails 4中清理原始SQL

Rails 4:如何在 Rails 中使用 JQuery 禁用基于复选框值的文本字段

在 Rails 4 中如何使用 attr_accessible?

在 Rails 4 中使用 Jquery Raty 并显示平均星级

在 Rails 4 中添加背景图像

Rails 4 在模型中添加新列或字段