rails中的strong_parameters用于多个键

时间:2015-06-07 17:47:23

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

我想从params访问三个键。

说我的参数是:

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帮助我并支持我:)

2 个答案:

答案 0 :(得分:1)

你想要

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

Nested Parameters

答案 1 :(得分: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模式会更方便。