如何在 Rails 中使用强参数方法存储随机嵌套变量?
Posted
技术标签:
【中文标题】如何在 Rails 中使用强参数方法存储随机嵌套变量?【英文标题】:How can I store random nested variables with strong params methods in Rails? 【发布时间】:2021-11-02 01:02:30 【问题描述】:我有以下课程:
class ArticlesController < ApplicationController
def create
article = Article.new(article_params)
end
private
def article_params
params.permit(:name, :age, book: [])
end
end
我有一个名为 book 的字段,其中包含一个集合,后跟一个哈希 [...],在哈希对象内它可以包含任何随机属性,例如:
book_1 =
[
"id": "a1",
"type": "Color",
"title": "Live life cicle",
"content": "image_intro.png"
,
]
book_2 =
[
"id": "a2",
"email": "example@gmail.com",
"domain": "http://ddd.com"
]
...
book_7
[
"id": "a23",
"width": "3px",
"heigth": "5px",
"exist": true
]
我希望每次保存一本书时,无论它在哈希中包含什么属性,它都可以通过article_params,如果您能帮助我,我将不胜感激。
【问题讨论】:
文档:guides.rubyonrails.org/… 和 github.com/rails/rails/blob/main/actionpack/lib/… 和 这能回答你的问题吗? Rails - Strong Parameters - Nested Objects 虽然@JaredBeck 向您指出了来源,但我认为与您的问题相关的部分是“必须指定应该允许的嵌套属性。如果您只使用permit
指向嵌套属性散列的键,它将返回一个空散列。”(第 1162 行)和 “想象一个场景,其中有代表产品名称的参数和与之关联的任意数据的散列产品,并且您希望在文档中允许产品名称属性以及整个数据哈希”。
这意味着虽然您不能只使用books: []
并让它接受该数组中的任何内容。只要您的books
值为"0" => "id": "a1","type": "Color","title": "Live life cicle","content": "image_intro.png" , "1" => "id": "a2","email": "example@gmail.com","domain": "http://ddd.com"
等,您就可以使用books:
。
【参考方案1】:
ActionController::Parameters 没有“通配符”语法来允许任何嵌套的哈希键。但它确实有#permit!
,这表明强参数并不是所有可能问题的解决方案。
permit!
通过在 ActionController::Parameters 实例上设置 permitted
属性完全绕过白名单。
它还将在 ActionController::Parameters 的任何嵌套实例上设置允许的属性 - 即参数中的嵌套哈希。
这是一个非常锋利的工具,应小心使用。
在这种情况下,您可能只想在嵌套属性上使用它:
params.permit(:name, :age).merge(
books: params.dup.permit!.fetch(:books, [])
)
【讨论】:
应该注意.permit!
也会在ActionController::Parameters
的任何嵌套实例上设置permitted
属性——即参数中的嵌套哈希。谨慎使用。以上是关于如何在 Rails 中使用强参数方法存储随机嵌套变量?的主要内容,如果未能解决你的问题,请参考以下文章