尝试获取POST以返回400错误请求

kjs*_*js3 24 strong-parameters ruby-on-rails-4

我有一个通过关联构建新模型的create方法,如果POST请求中没有params,我希望它返回带有一些文本的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
Run Code Online (Sandbox Code Playgroud)

如果我通过params它很好,但我正在尝试测试错误的请求方案.这是错误:

ActionController::ParameterMissing: param not found: cast_profile
Run Code Online (Sandbox Code Playgroud)

我可以明确地拯救它,但我认为强大的参数应该自动完成.

Bar*_*art 44

行为如下:

处理未经许可的密钥

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

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

(来源)

我建议使用400状态(错误请求)从此异常中抢救:

rescue_from ActionController::ParameterMissing do
  render :nothing => true, :status => :bad_request
end
Run Code Online (Sandbox Code Playgroud)

  • 我想知道"没有努力"是什么意思.我的印象是400响应是自动的,没有明确的救援. (3认同)
  • 看起来一切都按预期工作.在浏览器(开发)中,我得到了一个400响应的错误页面.这只是测试环境看起来很奇怪.正如预期的那样抛出异常,但是,无论是在rails还是minitest中都没有捕获它,而是以另一种方式获取错误并且错误地将整个测试错误地放在响应中.所以,这似乎是一个测试问题.如果您对测试有任何建议,我仍然感到困惑.最后,我明确获救,使测试成为可能并返回422,因为这似乎更正确. (3认同)