【问题标题】:Trying to get a POST to return 400 bad request试图让 POST 返回 400 错误请求
【发布时间】:2014-01-15 15:12:54
【问题描述】:

我有一个 create 方法,它通过关联构建一个新模型,如果 POST 请求中没有参数,我希望它返回一个带有一些文本的 400 响应。但是,我得到一个错误。

这是在 Rails 4.0.2 中

控制器方法:

  def create
    @cast_profile = current_user.build_cast_profile(cast_profile_params)
    if @cast_profile.save
      redirect_to cast_profile_path
    else
      render :edit
    end
  end

  def cast_profile_params
    params.require(:cast_profile).permit(:name, :email, :public)
  end

如果我通过参数一切都很好,但我正在尝试测试错误的请求场景。 这是错误:

ActionController::ParameterMissing: param not found: cast_profile

我可以明确地拯救它,但我认为强参数应该自动做到这一点。

【问题讨论】:

    标签: ruby-on-rails-4 strong-parameters


    【解决方案1】:

    行为如下:

    未经许可的密钥的处理

    默认情况下,未明确允许的参数键将是 登录开发和测试环境。在其他环境 这些参数将被过滤掉并忽略。

    此外,此行为可以通过更改 config.action_controller.action_on_unpermitted_pa​​rameters 属性 你的环境文件。如果设置为 :log 未经许可的属性将 被记录,如果设置为 :raise 将引发异常。

    (source)

    我建议以 400 状态(错误请求)从这个异常中解救出来:

    rescue_from ActionController::ParameterMissing do
      render :nothing => true, :status => :bad_request
    end
    

    【讨论】:

    • 我在处理未经许可的密钥方面没有问题。我遇到了所需密钥的问题。在您链接的文档中进一步说...
    • 此外,可以将参数标记为必需,并通过预定义的引发/救援流程最终成为 400 错误请求。
    • 我想知道“不费吹灰之力”是什么意思。我的印象是 400 响应将是自动的,无需明确救援。
    • 看起来一切都按预期工作。在浏览器(开发)中,我收到一个带有 400 响应的错误页面。只是测试环境看起来很奇怪。异常按预期抛出,但是,rails 没有像在 dev 中那样捕获它,或者 minitest 以另一种方式获取错误,并且在不让它继续响应的情况下使整个测试出错。所以,这似乎是一个测试问题。如果您对测试有任何建议,我仍然感到困惑。最后,我明确解救以使测试成为可能并返回 422,因为这似乎更正确。
    • 这个问题似乎还没有解决。
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多