Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 params.require(:person.permit(:name,:age)`在Rails 4中做什么?_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 4 params.require(:person.permit(:name,:age)`在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

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

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
视为过滤

  • require
    将返回给定键下的参数(如果存在),或raise
  • 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
for
allowed?
响应
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
{}