简体   繁体   English

如何使用strong_params来要求嵌套参数

[英]How to use strong_params to require a nested parameter

I'm making a Rails app, and I'd like a controller to gracefully handle an improperly formatted request. 我正在制作一个Rails应用程序,我想要一个控制器来优雅地处理格式不正确的请求。 So, ideally, the parameters hash would look like this: 所以,理想情况下,参数hash看起来像这样:

{"user" => { "username"=>"user1212" } }

But if someone sends data that looks like this: 但如果有人发送的数据如下所示:

{"user" => "user1212" }

I want to be able to raise a descriptive error, preferably a ParameterMissing. 我希望能够引发一个描述性错误,最好是一个ParameterMissing。 Right now, my user_params method looks like this: 现在,我的user_params方法如下所示:

def user_params
   params.require(:user).require(:username)
end

But if params.require(:user) returns a string, as in the second example, I get a NoMethodError. 但是如果params.require(:user)返回一个字符串,就像在第二个例子中那样,我得到一个NoMethodError。 I tried params[:owner].require(:username) but that gives a TypeError. 我尝试了params[:owner].require(:username)但是它给出了一个TypeError。 I've tried a bunch of combinations of permit and require, but I haven't found a solution I like. 我尝试了许多许可和要求的组合,但我没有找到我喜欢的解决方案。 Is there a nice, clean way to require that params[:user] be a hash? 是否有一个很好的,干净的方式来要求params [:user]是一个哈希?

require returns the parameter or raises an error if the key isn't there so to get what you want I had to do the following: 如果键不存在,则require返回参数或引发错误,以便得到你想要的东西我必须执行以下操作:

def user_params
   params.require(:user).require(:username)
   params.require(:user).permit(:username)
end

note: order is important as you want the full parameter returned ie your user parameter so the permit statement needs to come last. 注意:顺序很重要,因为您希望返回完整参数,即您的用户参数,因此permit语句需要最后。 And if you wanted some optional parameters like email you would do the following: 如果您想要一些可选参数,例如电子邮件,您可以执行以下操作:

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

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

raise ActionController::ParameterMissing.new(:username) if params.fetch(:user).is_a?(String)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM