【问题标题】:How to use Rails Action Controller Nested Params to Permit a Specific Attributes Hash如何使用 Rails 动作控制器嵌套参数来允许特定的属性哈希
【发布时间】:2015-06-24 19:14:50
【问题描述】:

关于嵌套参数有很多问题,但我似乎找不到一个能解决我的具体、简单情况的问题。

我正在尝试允许不是数组的嵌套哈希。我希望这会起作用:

params.require(:book).permit(:title, :description, style: {:font, :color})

但它导致了语法错误。

然而,这行得通:

params.require(:book).permit(:title, :description, style: [:font, :color])

但我的问题是,它似乎允许style 值是具有属性:font 和:color 的项目数组。我只想允许具有这两个属性的单个哈希。

我尝试了其他变体,但我不断收到语法错误。我将不胜感激。

上下文:Rails 4.1.7、Ruby 2.0.0(它在我的待办事项清单上要升级!),不使用 ActiveRecord。

【问题讨论】:

    标签: ruby-on-rails hash strong-parameters actioncontroller


    【解决方案1】:

    我认为如果您将style 括在花括号中,它应该可以工作,即:

    params.require(:book).permit(:title, :description, { style: [:font, :color] })
    

    【讨论】:

    • 不幸的是,这不起作用。我收到语法错误...SyntaxError (.../books_controller.rb:333: syntax error, unexpected ',', expecting => ...le, {style: {:font, :color}}) ... 在我的 test.log 文件中,^ 插入符号指向 :font 之后的逗号作为问题的根源。
    • 重要的是要注意@ezekg 提到的内容:{:font, :color} 不是有效的红宝石。一般而言,如果您想要一个符号数组,请执行[:font, :color]。如果您想要一个键值哈希,请使用大括号,但使用 { :key => :value } 而不是中间的逗号(@readyornot 语法错误的来源)。或者,更好的是现代语法版本{ key: :value },实际上是相同的。
    • @GabrielOsorio:你完全正确。我已经确定了答案。
    【解决方案2】:

    看起来可能需要:

    params.require(:book).permit(:title, :description, style: [{:font, :color]})
    

    基于来自Rails API Guide的这个例子

       pets: [{
          name: 'Purplish',
          category: 'dogs'
        }]
    

    编辑,我当然可能是错的,但遵循rules quoted here

    TL;DR:在尝试找出如何解决问题时,请使用此经验法则 白名单嵌套属性:允许哈希,传递数组以允许 一个数组,传递一个哈希

    【讨论】:

    • 是来自宠物的例子吗?我认为那是针对宠物的 array 的,而我只想要一个具有某些属性的宠物。
    • 我认为您对经验法则的看法是正确的。在您链接到的 API 指南中向下滚动,您会看到这个...params.require(:person).permit(contact: [ :email, :phone ]) # => {"contact"=>{"email"=>"none@test.com", "phone"=>"555-1234"}}
    • 当我在控制器规范中尝试这个时,我不喜欢的是以下两种情况都是允许的...... 1)联系:{电子邮件:“”,电话:“ "} {email: "", phone: ""} 分配给联系人属性。 2) contact: [{email: "1", phone: "1"}, {email: "2", phone: "2"}] [{email: "2", phone: "2"}] 到联系人属性。我不喜欢这个;我希望只为联系人属性分配一个哈希,而不是一个数组。
    • 我想知道您是否可以通过多次调用它params.permit 或像 strong_parameters github 页面中使用的示例那样传入单独的哈希值来让它完全按照您的意愿行事? github.com/rails/strong_parameters#require-multiple-parameters
    【解决方案3】:

    问题在于,正如您的错误所述,您有语法错误。这是因为 {:font, :color} 不是有效的 Ruby。您正在尝试将哈希语法{ key: value } 与数组语法[:one, :two] 混合使用。您可能想要做的是,

    # Accept params: { book: { style: { font: value, color: value } } }
    params.require(:book).permit(style: [:font, :color])
    

    或者,

    # Accept params: { book: { style: [{ font: value, color: value }] } }
    params.require(:book).permit(style: [[:font, :color]])
    

    您使用键数组来接受散列(不是数组)这一事实正是strong_parameters 的工作原理。要接受一个数组,你实际上只是做这样的事情,

    # Accept params: { book: { style: [:font, :color] } }
    params.require(:book).permit(style: [])
    

    希望能澄清问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多