这看起来确实令人困惑,我同意。
从 的实现#permit
和文档来看ActionController::Params
,这可能会根据配置而有所不同,配置action_on_unpermitted_parameters
接受:log
和:raise
作为值,nil
默认情况下是。
什么时候action_on_unpermitted_parameters = nil
:
调用params.permit(:foo)
将返回一个ActionController::Parameters
仅使用该键标记为允许的新实例。
如果您不使用返回值,则此调用毫无意义,因为没有副作用。接收器没有突变。
什么时候action_on_unpermitted_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>
如您所见,对于每次permit
通话,您都会获得不同的日志。因此,只有当该控制器中的代码包含所有允许(和必需)的参数时,这才有意义:
irb> params.permit(:username, :offset, :limit)
Unpermitted parameter: :bogus
=> <ActionController::Parameters {"username"=>"john", "offset"=>5} permitted: true>
什么时候action_on_unpermitted_parameters = :raise
:
这里的效果是,当参数包含不允许的键时,它会引发。与 类似: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)
将其与包含所有键进行对比:
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)
action_on_unpermitted_parameters
话虽如此,我在 Discourse 的代码库中找不到任何出现的地方。因此,值是nil
,因此我得出结论,#permit
在该控制器中,动作在功能方面没有影响。
它可以作为文档的约定存在,首先列出所有必需的参数,然后列出所有可选参数。
深入挖掘,这些#permit
调用是在此提交中引入的,当时它还是一个名为strong_parameters的单独 gem 。#permit
那颗宝石中的行为和今天一样。这让我觉得那个提交的作者误解了strong_parameters的 API 。