Ruby on rails 轨道5。如果设置了一个许可证密钥,则不需要使用强参数

Ruby on rails 轨道5。如果设置了一个许可证密钥,则不需要使用强参数,ruby-on-rails,ruby,strong-parameters,rails-api,ruby-on-rails-5,Ruby On Rails,Ruby,Strong Parameters,Rails Api,Ruby On Rails 5,我正在使用Rails 5创建JSON Api 我的控制器使用带有一个require属性的强参数,如下所示: params.require(:require_attribute).permit(:permit_attribute1,:permit_attribute2) 通常,我必须像这样发送JSON: { "require_attribute":{ "permit_attribute1": "data", "permit_attribute2": "da

我正在使用Rails 5创建JSON Api

我的控制器使用带有一个require属性的强参数,如下所示:

params.require(:require_attribute).permit(:permit_attribute1,:permit_attribute2)
通常,我必须像这样发送JSON:

{
    "require_attribute":{
        "permit_attribute1": "data",
        "permit_attribute2": "data"
    }
}
如果缺少必需的属性,我必须得到以下消息:

"ActionController::ParameterMissing: param is missing or the value is empty: require_attribute"
我的问题是,如果我从JSON中删除所需的属性,并且我有一个与强参数相同的
permit
属性,那么它确实可以工作

我发送的JSON:

{
    "permit_attribute1": "data",
}
当我在
log
中获取参数时,我有:

{“permit1”=>data,“controller”=>“mycontroller”,“action”=>“create”,“require\u attribute”=>{“permit1”=>1}}

Rails似乎创建了一个具有所需密钥的散列,而不是引发错误。 但我希望在收到JSON时强制使用必需的属性

有人有主意吗

强参数API是根据最常见的用例设计的 记住。这并不是解决你所有问题的灵丹妙药 白名单问题

require(键)

确保参数存在。如果存在,则返回 参数,否则将引发
ActionController::参数丢失
错误

从上面的设置中可以看出,在“平面”散列上设置所需参数并不是构建strong parameters API的真正目的。而是围绕rails约定构建的,其中参数嵌套在单个键下

您可以使用´.require´一次拉动一个键,但这相当笨拙

相反,您可以通过引发异常来模拟它的功能,除非存在密钥:

def something_params
  req = [:required_attribute1, :required_attribute2]
  req.each do |k|
    raise ActionController::ParameterMissing.new(k) unless params[k].present?
  end
  whitelisted = params.permit(:permit_attribute1, :permit_attribute2)
end
但是,一个更好的方法可能是使用模型级验证-
ActionController::ParameterMissing
应该表示请求的常规格式已关闭,而不是缺少必需的属性。例如,对于JSONAPI.org格式的请求,您可以执行以下操作:

params.require(:data).require(:attributes).permit(:email, :username)

确保请求符合标准。但是,强制执行在没有电子邮件的情况下无法创建用户是模型级别的问题

是的,默认情况下,API模式下的Rails将JSON请求参数包装到一个散列中,从控制器类猜测其名称。您可以阅读详细信息

如果应用程序中不需要此功能,只需从
config\initializers\wrap_parameters.rb
中的
:format
数组中删除
:json
。或者,您也可以如上所述在控制器级别使用细粒度控制


这样,当所需的密钥不存在时,您将得到一个异常。

您使用什么来发送“更简单”的json?它是否有角度/重新角度?我在console或Postman addonAll中使用了curl,但当所需的键不存在时,
require
为什么没有引发错误?这似乎是这里的预期行为。不,不是真的。考虑到参数在Rails甚至匹配路由请求之前写入日志,并实例化控制器。我不确定错误是否出在您发送请求的方式上,或者是机架或某些中间件强制请求参数时出现的一些非常奇怪的问题。另外,
.require
实际上并没有修改
请求.params
。它返回一个副本。如果您检查服务器日志和参数,就会发现有可疑的事情发生。