我使用Ruby on Rails 7构建了一个REST API,它通过HTTP PATCH接受有效负载,如下所示:
{
"answers": [
{"question_id": 1, "content": "My answer content ONE"},
{"question_id": 2, "content": "My answer content TWO"}
]
}
我想在我的控制器中使用强参数验证此响应的结构。
我已经尝试了一堆类似的所以职位,但他们似乎都不适合我。
以下是我目前所尝试的方法:
params = ActionController::Parameters.new(answers: [{question_id: 1, content: 'some answer'}])
params.require(answers: [:question_id, :content])
# I get: `require': param is missing or the value is empty: {:answers=>[:question_id, :content]} (ActionController::ParameterMissing)
params.require(:answers).require([:question_id, :content])
# I get: NoMethodError on the second .require
params.require(answers: [[:question_id, :content]])
# I get: param is missing or the value is empty: {:answers=>[[:question_id, :content]]}
任何关于我做错了什么的建议都将非常感谢。
3条答案
按热度按时间5sxhfpxr1#
我刚把问题贴出来就找到了解决办法。
有效的解决方案是:
这使我能够确保所有值都以正确的结构提供,并在我的控制器方法中使用它,如下所示:
ovfsdjhp2#
为什么要坚持只通过
ActionController::Parameters
来验证参数呢?我总是发现params API对于嵌套结构(具体来说是我构建的API的更深层次的结构)的限制,在这种情况下,我总是以最基本的方式验证数据。例如,对于您所展示的数据结构,我会以以下方式验证它:Params API对于将数据列入白名单非常有用,但是当它对特定的数据结构造成限制时,与其坚持只通过该API实现验证,不如通过纯Ruby结构实现,这是一个始终开放的选项。
希望你觉得这个建议有帮助。
oxf4rvwz3#
您可以定义方法以确保参数结构如下所示:
然后在
update
操作中使用此方法,如下所示: