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

时间:2014-07-23 18:16:26

标签: ruby-on-rails error-handling controller strong-parameters

我正在制作一个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]是一个哈希?

2 个答案:

答案 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)