我想从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帮助我并支持我:)
答案 0 :(得分:1)
你想要
def product_params
params.permit(:product_id, :user_action, category: [ :name, :id ])
end
答案 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
模式会更方便。