【问题标题】:strong_parameters in rails for multiple keys多键的 rails 中的 strong_parameters
【发布时间】:2015-08-22 04:18:59
【问题描述】:

我想从参数访问三个键。

说我的参数是:

params = {
   'product_id' =>  11,
   'category' => {
                   'name' => 'Pet',
                   'sub_categories' => {5 => 'Name1', 7 => 'Name2'} ## **UPDATE**
                   'id' => 100
    },
    'user_action' => 'save'
}

现在我想使用强参数来过滤掉这些键。即

#Inside controller
#action
def save_product_category
  product_params[:product_id]
  product_params[:category]
  product_params[:user_action]
end

private
  def product_params
     params.permit(:product_id, :user_action, :category) # Doesn't work, eliminates 'category' key
  end

如何过滤掉这三个键?

更新: 我找到了一种方法:

params.slice(:product_id, :category, :user_action)

这是正确的做法吗?

更新 2: 正确答案如下:

params.permit(:product_id, :user_action, :category => [:id, :name, :sub_categories => {}])

感谢@R_O_R 和@twonegatives 帮助我并容忍我:)

【问题讨论】:

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


    【解决方案1】:

    您应该明确定义参数的所有嵌套属性:

    def product_params
      params.permit(:product_id, :user_action, category: [:id, :name] )
    end
    

    参考Rails 4 Strong parameters nested objects

    更新

    关于slice 的问题,嗯,这种用法也是可能的。长话短说,早在 2012 年,人们就使用 Rails 3,它没有提供任何过滤控制器中传入参数的方法,因此为此使用了 slice 方法。甚至可以在stackoverflow(参见slicing on mass assignment)和github(这里是来自DHH 的gist,Ruby on Rails 的创建者)上找到对那个时代的一些参考。归根结底,strong parameters gem 只是对slice 模式的提取。但现在,在 Rails 4 中遵循 permit 模式会更方便。

    【讨论】:

    • 我已经用slice 方法的注释更新了我的答案。
    • 我已经更新了“类别”中所需的参数。您能否检查上述问题的参数部分类别的子类别?请参考之前答案的cmets。
    • @Indyarocks 您应该更加注意人们将您引导至的链接。这个答案正好解决了你的最后一个问题(可以在我上面发布的 Rails 4 strong params 线程中找到):stackoverflow.com/a/24475600/1276552
    • 得到了答案。 params.permit(:product_id, :user_action, :categories => [:id, :name, :sub_categories => {}]) 。谢谢。
    • 谢谢@twonegatives。在链接中,答案具有为sub_categories 定义的特定键。 params.require(:foo).permit(:bar, {:baz => [:x, :y]}):x:y。我想允许完整的哈希。无论如何,很抱歉没有首先明确提出我的问题。谢谢!
    【解决方案2】:

    你想要的

    def product_params
      params.permit(:product_id, :user_action, category: [ :name, :id ])
    end
    

    Nested Parameters

    【讨论】:

    • 不,它们不一样。在使用 slice 时,您正在从 params 中提取所需的属性,这是您用来更新的另一个 Hash 对象。但是如果要直接使用param对象,则需要借助strong参数
    • 同意。但是在更新的查询中,我更新了“类别”中所需的参数。您能否检查上述问题的sub_categoriescategoryparams 部分?
    • @Indyarocks 我检查了,我所说的只是再次应用。只需阅读链接的文档,您就会明白。
    • 是的,我浏览了链接。谢谢。问题是:params.permit(:product_id, :user_action, :categories => [:id, :name, :sub_categories => [ ????]]),因为 keys 里面的 sub_categories 哈希是用户输入而不是特定的符号/字符串键,我如何将它们列入白名单?
    • @Indyarocks 很高兴你得到答案.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多