gpt4 book ai didi

ruby-on-rails - Rails 5. 如果设置了一个许可 key ,则不需要使用强参数

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:44 25 4
gpt4 key购买 nike

我正在使用 Rails 5 创建一个 JSON Api。

我的 Controller 使用带有一个 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 中删除 required 属性并且我有一个 permit 属性与强参数一样,它确实有效。

我发送的 JSON:

{
"permit_attribute1": "data",
}

当我在 log 中得到 params 时,我有:

{"permit1"=>data, "controller"=>"mycontroller", "action"=>"create", "require_attribute"=>{"permit1"=>1}}

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

有人有想法吗?

最佳答案

The strong parameter API was designed with the most common use cases in mind. It is not meant as a silver bullet to handle all your whitelisting problems.

http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters

require(key)

Ensures that a parameter is present. If it's present, returns the parameter at the given key, otherwise raises an ActionController::ParameterMissing error.

http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require

正如您从上面看到的那样,在“平面”哈希上设置所需参数并不是构建强参数 API 的真正目的。相反,它是围绕 rails 约定构建的,其中参数嵌套在单个键下。

您可以使用“.require”一次拉出一个键,但这会相当笨拙。

除非 key 存在,否则您可以通过引发异常来模拟它的作用:

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)

这确保请求遵循标准。但是,强制执行没有电子邮件就无法创建用户是模型级别的问题。

关于ruby-on-rails - Rails 5. 如果设置了一个许可 key ,则不需要使用强参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35153093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com