如何使用 strong_params 要求嵌套参数

fre*_*ead 5 error-handling controller ruby-on-rails strong-parameters

我正在制作一个 Rails 应用程序,我想要一个控制器来优雅地处理格式不正确的请求。因此,理想情况下,参数哈希如下所示:

{"user" => { "username"=>"user1212" } }
Run Code Online (Sandbox Code Playgroud)

但是如果有人发送看起来像这样的数据:

{"user" => "user1212" }
Run Code Online (Sandbox Code Playgroud)

我希望能够引发描述性错误,最好是 ParameterMissing。现在,我的 user_params 方法如下所示:

def user_params
   params.require(:user).require(:username)
end
Run Code Online (Sandbox Code Playgroud)

但是如果params.require(:user)返回一个字符串,如第二个例子,我得到一个 NoMethodError。我试过了,params[:owner].require(:username)但这给出了一个 TypeError。我已经尝试了一堆许可和要求的组合,但我还没有找到我喜欢的解决方案。有没有一种很好的、​​干净的方法来要求 params[:user] 是一个散列?

Ale*_*ney 5

require 返回参数,或者如果密钥不存在则引发错误,因此为了获得您想要的内容,我必须执行以下操作:

def user_params
   params.require(:user).require(:username)
   params.require(:user).permit(:username)
end
Run Code Online (Sandbox Code Playgroud)

注意:顺序很重要,因为您希望返回完整的参数,即您的用户参数,因此许可语句需要放在最后。如果您想要一些可选参数(例如电子邮件),您将执行以下操作:

def user_params
   params.require(:user).require(:username)
   params.require(:user).permit(:username, :email)
end    
Run Code Online (Sandbox Code Playgroud)


rab*_*mar 0

如果你只是想提出 anActionController::ParameterMissing而不是NoMethodError,我想你可以这样做:

raise ActionController::ParameterMissing.new(:username) if params.fetch(:user).is_a?(String)
Run Code Online (Sandbox Code Playgroud)