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

来自阿巴斯的萨尔曼

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

discourse/app/controllers/drafts_controller.rb: GitHub

class DraftsController < ApplicationController
  # [...]

  def index
    # [...]
    params.permit(:offset)
    params.permit(:limit)

    # [...]

    opts = {
        # [...]
        offset: params[:offset],
        limit: params[:limit]
    }

    stream = Draft.stream(opts)
飞利浦

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

从 的实现#permit和文档来看ActionController::Params,这可能会根据 config 有不同的行为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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

处理Rails ActionController :: BadRequest

Rails ActionController未知格式

rails 4.2.0 ActionController :: UrlGenerationError

ActionController :: UnknownFormat:使用Rspec时

rails4 // ActionController :: UnknownFormat

Rails 5中的ActionController :: InvalidAuthenticityToken

Rails ActionController参数错误

Rails 5 ActionController :: InvalidAuthenticityToken错误

Rails 4中的ActionController :: InvalidAuthenticityToken

Rails:“ translate”如何暴露给ActionController?

Rails 5 Rspec ActionController :: UrlGenerationError

常规ActionController :: InvalidAuthenticityToken异常-Rails

Rails测试失败-ActionController :: UnknownFormat:

在Ruby on Rails中的ActionController :: InvalidAuthenticityToken

使用link_to的ActionController :: UrlGenerationError

使用 NGINX 和 Rails 登录时的 ActionController::InvalidAuthenticityToken

j(render(@partial))返回错误:ActionController :: UnknownFormat

间歇性Rails 5 ActionController :: InvalidAuthenticityToken

Rails ActionController忽略请求标头

Rails-字符串的ActionController :: Parameters

Rails4 ActionController :: InvalidAuthenticityToken错误

如何修复Rails中的“ ActionController :: ParameterMissing”错误?

Rails:嵌套form_for错误:'ActionController :: UrlGenerationError'

更新密码时的ActionController :: InvalidAuthenticityToken

如何获得使用Thin的ActionController :: Live流?

为什么返回在golang中实现错误接口的类型会自动调用Error()方法?

使用AJAX调用删除对象时,为什么会返回2个响应200和204?

当hashcode()实现返回常量值时,为什么哈希表会退化为链接列表?

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):將 JSON 參數發佈到 Rails 控制器時