不带 Accept_nested_attributes_for 的解决方案
这是我在 SO 上的第二个答案,但我多次遇到这个问题,在撰写本文时无法找到合理的解决方案,并在做了一些nested_attributes 假设并想分享我对它的最佳理解后终于自己弄清楚了. 我相信你所追求的强大的参数线是这样的:
product_params = params.require(:products).permit(product_fields: [:value1, :value2, etc...])
我不确切知道您的表单是什么样的,但您需要有一个 fields_for 将参数嵌套在 product_fields(或 any_name)中:
form_for :products do |f|
f.fields_for product_fields[] do |pf|
pf.select :value1
pf.select :value2
...
end
end
这将允许 permit() 接受单个显式哈希
product_fields => {0 => {value1: 'value', value2: 'value'}}
而不是键/值对
0 => {value1: 'value', value2: 'value'}, 1 => {value1: 'value', value2: 'value'}, etc...
否则您必须单独命名:
.permit(0 => [value1: 'value', value2: 'value'], 1 => [...], 2 => [...], ad infinitum)
这允许您更新多个产品,而无需使用接受嵌套属性的父模型。我刚刚在我自己的 Rails 4.2 项目中测试了它,它就像一个魅力。至于创建多个:如何在 Rails 中一次保存多个记录?.
至于计数器,您可能需要单独迭代每个模型:
product_params[:product_fields].keys.each_index do |index|
Product.create!(product_params.merge(counter: index))
end
想了这么久,你可能自己解决了这个问题。:-)