如何在 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" =&gt; "id": "a1","type": "Color","title": "Live life cicle","content": "image_intro.png" , "1" =&gt; "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 中使用强参数方法存储随机嵌套变量?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 强参数 - 允许在数组中进行深度嵌套哈希

我的 rails 嵌套模型无法识别 _destroy 属性

如何允许具有强参数的数组

rails - 设计强参数总是不允许注册

如何在 ruby​​ on rails 中编写嵌套查询?

嵌套表单 - 我无法将所有属性参数传递给我的强参数