Ruby on rails Rails:当不使用ActionController::Parameters#permit()返回的对象时,调用它能实现什么?

Ruby on rails Rails:当不使用ActionController::Parameters#permit()返回的对象时,调用它能实现什么?,ruby-on-rails,ruby,discourse,actionpack,Ruby On Rails,Ruby,Discourse,Actionpack,调用params.permit(:foo)将创建一个新的ActionController::Parameters实例,并将:foo列入白名单,以便您可以用它实例化模型。但是为什么下面的代码在CMS中调用它而不使用它的返回值呢 话语/app/controllers/drafts\u controller.rb: class DraftsController

调用
params.permit(:foo)
将创建一个新的
ActionController::Parameters
实例,并将
:foo
列入白名单,以便您可以用它实例化模型。但是为什么下面的代码在CMS中调用它而不使用它的返回值呢

话语/app/controllers/drafts\u controller.rb

class DraftsController
我同意,这看起来确实令人困惑

从的实现和文档判断,这可能会根据config
action\u on\u unpermitted\u参数
的不同表现,该参数接受
:log
:raise
作为值,默认为
nil

对不允许的参数执行操作=nil时:

调用
params.permit(:foo)
将返回一个新的
ActionController::Parameters
实例,该实例仅使用该键标记为允许

如果不使用返回值,则此调用没有任何意义,因为没有副作用。接收者没有变异

对不允许的参数执行操作时=:log

其行为与上述相同,但有记录所有不允许的密钥的副作用:

irb> ActionController::Parameters.action_on_unpermitted_parameters = :log
=> :log
irb> params = ActionController::Parameters.new(username: 'john', offset: 5, bogus: 'foo')
=> <ActionController::Parameters {"username"=>"john", "offset"=>5, "bogus"=>"foo"} permitted: false>
irb> params.require(:username)
=> "john"
irb> params.permit(:offset)
Unpermitted parameters: :username, :bogus
=> <ActionController::Parameters {"offset"=>5} permitted: true>
irb> params.permit(:limit)
Unpermitted parameters: :username, :offset, :bogus
=> <ActionController::Parameters {} permitted: true>
对未经允许的参数采取行动时=:提高

这里的效果是,当参数包含不允许的键时,它将引发。与
:log
类似,这仅在指定了所有允许(和必需)键时才有意义:

irb> ActionController::Parameters.action_on_unpermitted_parameters = :raise
=> :raise
irb> params = ActionController::Parameters.new(username: 'john', offset: 5, bogus: 'foo')
=> <ActionController::Parameters {"username"=>"john", "offset"=>5, "bogus"=>"foo"} permitted: false>
irb> params.require(:username)
=> "john"
irb> params.permit(:offset)
Traceback (most recent call last):
        1: from (irb):19
ActionController::UnpermittedParameters (found unpermitted parameters: :username, :bogus)
irb> params.permit(:limit)
Traceback (most recent call last):
        2: from (irb):20
        1: from (irb):20:in `rescue in irb_binding'
ActionController::UnpermittedParameters (found unpermitted parameters: :username, :offset, :bogus)

话虽如此,我在语篇的代码库中找不到任何关于未经允许的参数的
动作。因此,该值为
nil
,因此我得出结论,控制器操作中的
#permit
在功能方面没有影响

它可以作为一种惯例,作为文档,首先列出所有必需的参数,然后列出所有可选参数


更深入地挖掘,这些
#permit
调用是在它还是一个单独的称为strong_参数的gem时引入的。在那块宝石中,
#permit
的行为与今天一样。这使我认为,提交的作者误解了强参数的API。

取决于您的
操作\u on \u unpermitted \u参数
配置。
irb> params.permit(:username, :offset, :limit)
Unpermitted parameter: :bogus
=> <ActionController::Parameters {"username"=>"john", "offset"=>5} permitted: true>
irb> ActionController::Parameters.action_on_unpermitted_parameters = :raise
=> :raise
irb> params = ActionController::Parameters.new(username: 'john', offset: 5, bogus: 'foo')
=> <ActionController::Parameters {"username"=>"john", "offset"=>5, "bogus"=>"foo"} permitted: false>
irb> params.require(:username)
=> "john"
irb> params.permit(:offset)
Traceback (most recent call last):
        1: from (irb):19
ActionController::UnpermittedParameters (found unpermitted parameters: :username, :bogus)
irb> params.permit(:limit)
Traceback (most recent call last):
        2: from (irb):20
        1: from (irb):20:in `rescue in irb_binding'
ActionController::UnpermittedParameters (found unpermitted parameters: :username, :offset, :bogus)
irb> params.permit(:username, :offset, :limit)
Traceback (most recent call last):
        2: from (irb):21
        1: from (irb):21:in `rescue in irb_binding'
ActionController::UnpermittedParameters (found unpermitted parameter: :bogus)