【发布时间】: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_params。check_params在不同的控制器中不一样不会违反DRY,因为方法会因不同的原因而改变。 -
是的,但也许我们可以减少它的代码,因为它只是改变一个符号
:user -
为什么需要手动检查这个?当您使用 StrongParams(如您所做的那样)并调用
params.require(:user)并且参数中没有这样的键时,将引发ActionController::ParameterMissing异常,该异常应该已经涵盖了您的用例。 -
@spickermann 我不想显示该异常,而是显示 json 错误消息。
标签: ruby-on-rails ruby controller