【问题标题】:Rails action params[:user] not provided how return errorRails action params[:user] 未提供如何返回错误
【发布时间】:2021-02-28 06:18:50
【问题描述】:

我正在做一个项目,我想确保如果请求没有用户参数它应该发送错误,所以我在控制器中使用了以下方法

class UsersController < ApplicationController
  before_action :check_params

  private

  def user_params
    params.require(:user).permit(:email, :password)
  end

  def check_params
    render json: { error: 'No user params provided' }, status: 401 unless params[:user]
  end
end

它工作正常,但我必须安装每个单独的控制器,有没有办法可以将它添加到所有控制器的应用程序中!因为只有params[:user] 改变,所以如果我有params[:company],我必须在 CompaniesController 中添加另一个方法,其中 params[:company] 并不是很干。当我们使用 params.require(:user) 时,我很惊讶为什么它会给出错误而不是返回验证错误。

【问题讨论】:

  • 如果不同控制器中的参数名称和错误消息不同 - 更简单的是在具有不同参数的控制器中拥有自己的check_paramscheck_params在不同的控制器中不一样不会违反DRY,因为方法会因不同的原因而改变。
  • 是的,但也许我们可以减少它的代码,因为它只是改变一个符号:user
  • 为什么需要手动检查这个?当您使用 StrongParams(如您所做的那样)并调用 params.require(:user) 并且参数中没有这样的键时,将引发 ActionController::ParameterMissing 异常,该异常应该已经涵盖了您的用例。
  • @spickermann 我不想显示该异常,而是显示 json 错误消息。

标签: ruby-on-rails ruby controller


【解决方案1】:

我看起来你想通过自定义错误消息从 ActionController::ParameterMissing 中解救出来。 Rails 的方法是rescue_from 方法。

将以下内容添加到您的控制器:

rescue_from 'ActionController::ParameterMissing' do |exception|
  render json: { error: 'No user params provided' }, status: 401
end

【讨论】:

    【解决方案2】:

    除了创建整个方法之外,您还可以在您的操作检查 params[:user] 之前检查并在单行上拒绝,如下所示

    @user = User.find_by_email(params[:user][:email]) if params[:user]
    

    现在它不会搜索你的参数[:user]

    【讨论】:

      【解决方案3】:

      您可以将通用逻辑移动到基类中的方法中,然后派生类可以将自己的“可变”变量传递给它或忽略方法

      class ApplicationController
        def check_params(name, error_message)
          render json: { error: error_message }, status: 400 if params[name].nil?
        end
      end
      

      用法

      class UsersController < ApplicationController
        before_action -> { check_params(:user, "User is missing") }
      end
      

      【讨论】:

        猜你喜欢
        • 2015-08-27
        • 1970-01-01
        • 1970-01-01
        • 2019-09-23
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        相关资源
        最近更新 更多