【问题标题】:How can I store random nested variables with strong params methods in Rails?如何在 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,如果您能帮助我,我将不胜感激。

【问题讨论】:

  • 这能回答你的问题吗? 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: {}

标签: ruby-on-rails json ruby strong-parameters


【解决方案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 属性——即参数中的嵌套哈希。谨慎使用。
猜你喜欢
  • 2015-09-20
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2013-08-28
  • 2014-10-20
  • 2020-09-20
  • 2014-06-12
相关资源
最近更新 更多