【发布时间】:2013-08-27 19:03:50
【问题描述】:
Rails 4 文档中所有强参数的例子都使用
params.require(:person).permit(:name, :age)
有人可以解构并解释require 和permit 发生的情况吗?
【问题讨论】:
-
这个例子直接来自文档,解释了
permit而不是require。
标签: ruby-on-rails-4
Rails 4 文档中所有强参数的例子都使用
params.require(:person).permit(:name, :age)
有人可以解构并解释require 和permit 发生的情况吗?
【问题讨论】:
permit而不是require。
标签: ruby-on-rails-4
将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 这样的容器,都会被过滤掉。
【讨论】:
更准确地说,当您为例如创建时。做.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 示例可视化是什么?
控制器中的params看起来像一个Hash,但它实际上是ActionController::Parameters的一个实例,它提供了require和permit等几种方法。
require 方法确保存在特定参数,如果未提供,require 方法将引发错误。它为传递给require 的键返回ActionController::Parameters 的实例。
permit 方法返回参数对象的副本,仅返回允许的键和值。当创建一个新的 ActiveRecord 模型时,只有允许的属性被传递到模型中。
它看起来很像以前包含在 ActiveRecord 模型中的白名单,但将它放在控制器中更有意义。
【讨论】:
true 响应permitted? 方法。默认情况下,ActionController::Parameters 类的实例将返回false 为permitted? 响应true 到permitted? 表示参数对象可以用于批量赋值;否则应用程序将抛出 ForbiddenAttributes 错误。
require 上链接permit 是否也允许并在返回的对象中包含所需的参数?