Ruby on rails 4 params.require(:person.permit(:name,:age)`在Rails 4中做什么?
Rails 4文档中的所有强参数示例都使用Ruby on rails 4 params.require(:person.permit(:name,:age)`在Rails 4中做什么?,ruby-on-rails-4,Ruby On Rails 4,Rails 4文档中的所有强参数示例都使用 params.require(:person).permit(:name, :age) 有人能解释一下require和permit在这里发生了什么吗?控制器中的params看起来像散列,但实际上是的一个实例,它提供了多种方法,如require和permit 该方法确保存在特定参数,如果未提供该参数,require方法将抛出错误。它为传递到require的键返回ActionController::Parameters的实例 该方法返回parameter
params.require(:person).permit(:name, :age)
有人能解释一下
require
和permit
在这里发生了什么吗?控制器中的params
看起来像散列,但实际上是的一个实例,它提供了多种方法,如require
和permit
该方法确保存在特定参数,如果未提供该参数,require
方法将抛出错误。它为传递到require
的键返回ActionController::Parameters
的实例
该方法返回parameters对象的副本,只返回允许的键和值。创建新的ActiveRecord模型时,只将允许的属性传递到模型中
它看起来很像以前包含在ActiveRecord模型中的白名单,但如果它位于控制器中,则更有意义。更准确地说,当您为例如doing
.new(…)
创建时,必须有require指示的:person
散列,person散列只接受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
将
require
视为验证,将permit
视为过滤
将返回给定键下的参数(如果存在),或raiserequire
将返回在给定键上过滤的参数*permit
*请注意,
permit
只允许某些标量通过过滤器,如上例所示。相关数据的类型必须为String
,Symbol
,NilClass
,Numeric
,TrueClass
,false class
,日期
,DateTime
,StringIO
,ActionDispatch::Http::UploadedFile
或Rack::Test::UploadedFile
。所有其他内容,包括Array
和Hash
等容器,都会被过滤掉。这个例子直接来自文档,它解释了permit
,而不是require
。permit的描述有点不恰当:permit返回另一个仅包含允许的密钥和(这是关键的)的哈希将以true
响应允许的?
方法。默认情况下,ActionController::Parameters
类的实例将返回false
forallowed?
响应true
到allowed?
表示参数对象可用于批量分配;否则,应用程序将抛出禁止属性错误。链接是否允许require
上的也允许并在返回的对象中包含所需的参数?我发现命名很不幸,因为require所做的远不止是生成所需的允许参数。使用params.permit(:person,:name,:age)不起作用,并且会为典型表单生成“Unpermitted parameters::utf8”之类的错误。第三个和第四个不正常示例可视化了什么?@p0k8\u我编辑了答案以澄清这一点。这些示例显示了一些不“允许”的不同字段名。
>> 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
{}