如何“要求”参数不仅要存在,而且要成为 Rails 中带有字符串参数的哈希?

How to `require` parameters to not only to be present, but to be a Hash with String Parameters in Rails?

我在我们的控制器中有非常通用的代码来处理参数白名单和清理:

def create
  @sign_in = SignIn.new(sign_in_params)
  # ...
end

def sign_in_params
  params.require(:user).permit(:email, :password)
end

但是,这会引发以下参数的异常:

{
  "user": "foobar"
}

原因是 params[:user] 存在,但它不是 return 另一个哈希,而是一个字符串。

导致异常:NoMethodError: undefined methodpermit' for "foorbar":String`。

如何确保 require 不仅需要参数存在,而且还要求它是哈希?

根据 strong_parameters 文档,多次调用这些方法是有效的。所以你可以这样做:

# create a strong-parameter for testing
params = ActionController::Parameters.new({user: {email: "some@email.com"}})
# make sure the key is present, raises ActionController::ParameterMissing otherwise
params.require(:user)
# make sure the structure is as expected and use the result
return params.permit(user: [:email])