在 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)
有人可以解构并解释require
和permit
发生的情况吗?
【问题讨论】:
这个例子直接来自文档,解释了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
仅允许某些标量通过过滤器,如上一个示例所示。关联数据的类型必须为String
、Symbol
、NilClass
、Numeric
、TrueClass
、FalseClass
、Date
、Time
、DateTime
、StringIO
、 、ActionDispatch::Http::UploadedFile
或 Rack::Test::UploadedFile
。其他所有内容,包括像 Array
和 Hash
这样的容器,都会被过滤掉。
【讨论】:
【参考方案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
的一个实例,它提供了require
和permit
等几种方法。
require
方法确保存在特定参数,如果未提供,require
方法将引发错误。它为传递给require
的键返回ActionController::Parameters
的实例。
permit
方法返回参数对象的副本,仅返回允许的键和值。当创建一个新的 ActiveRecord 模型时,只有允许的属性被传递到模型中。
它看起来很像以前包含在 ActiveRecord 模型中的白名单,但将它放在控制器中更有意义。
【讨论】:
permit 的描述有点不对劲:permit 返回另一个仅包含允许键的哈希值并且(这很关键)将以true
响应permitted?
方法。默认情况下,ActionController::Parameters
类的实例将返回false
为permitted?
响应true
到permitted?
表示参数对象可以用于批量赋值;否则应用程序将抛出 ForbiddenAttributes 错误。
在require
上链接permit
是否也允许并在返回的对象中包含所需的参数?
我觉得命名很不幸,因为 require 不仅仅需要允许的参数。使用 params.permit(:person, :name, :age) 不起作用,并且会为典型表单生成诸如“Unpermitted parameters: :utf8”之类的错误。以上是关于在 Rails 4 中,`params.require(:person).permit(:name, :age)` 是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4:如何在 Rails 中使用 JQuery 禁用基于复选框值的文本字段
在 Rails 4 中如何使用 attr_accessible?