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


149

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

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

可能有人请解构和解释与发生requirepermit这里?


3
此示例直接来自文档,permit但没有解释require
Erik Trautman

Answers:


202

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

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

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

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


37
allow的描述有点离谱:allow返回另一个仅包含允许键的哈希,并且(这很关键)将true对该permitted?方法做出响应。默认情况下,ActionController::Parameters该类的实例将返回falsepermitted?Responding trueto” (响应到),这permitted?意味着可以将对象用于批量分配;否则应用程序将抛出ForbiddenAttributes错误。
sameers

3
并链接permitrequire也是允许的,包括在返回的对象所需的参数?
丹尼斯

我发现命名很不幸,因为require远远超出了允许参数的要求。使用params.permit(:person,:name,:age)无法正常工作,并且会针对典型形式生成诸如“ Unpermitted parameters::utf8”之类的错误。
达米安

6

更精确地说,当您创建例如。这样做.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

第三个not okay例子和第四个例子可以看到什么?
p0k8_

@ p0k8_我编辑了答案以澄清这一点。这些示例显示了一些不同的字段名称,这些字段名称不是“允许的”。
哈里·伍德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.