我正在制作一个Rails应用程序,而且我喜欢一个控制器来优雅地处理格式不正确的请求。因此,理想情况下,参数哈希看起来像这样:
{"user" => { "username"=>"user1212" } }
但如果有人发送的数据如下:
{"user" => "user1212" }
我希望能够引发一个描述性错误,最好是一个ParameterMissing。现在,我的user_params方法如下所示:
def user_params
params.require(:user).require(:username)
end
但是如果params.require(:user)
返回一个字符串,就像在第二个例子中那样,我得到一个NoMethodError。我尝试了params[:owner].require(:username)
但是它给出了一个TypeError。我已经尝试了许多许可和要求的组合,但我还没有找到我喜欢的解决方案。是否有一个很好的,干净的方法来要求params [:user]是一个哈希?
答案 0 :(得分:1)
要求返回参数或如果键不存在则引发错误,以便获得您想要的内容我必须执行以下操作:
def user_params
params.require(:user).require(:username)
params.require(:user).permit(:username)
end
注意:顺序很重要,因为您希望返回完整参数,即您的用户参数,因此permit语句需要最后一次。如果您想要一些可选参数,例如电子邮件,您可以执行以下操作:
def user_params
params.require(:user).require(:username)
params.require(:user).permit(:username, :email)
end
答案 1 :(得分:0)
如果您只想提出ActionController::ParameterMissing
而不是NoMethodError
,我猜您可以这样做:
raise ActionController::ParameterMissing.new(:username) if params.fetch(:user).is_a?(String)