我有一个ActiveModel“表单对象”,“有很多”患者(另一个ActiveModel“表单对象”)。作为用户的想法可以填写表格并添加尽可能多的患者。
- @form.patients.each do |patient|
= form.fields_for 'patients[]', patient do |patient_form|
这在Rails 4中运行良好,据我记得那些名为patients[][name]
的输入。
这是params
中的数组,例如{ patients: [ {name: 'foo'} ] }
。
然而,看起来这可能已经改变了Rails 5,看the source似乎名字在[]
结束并且没有索引,因为它会尝试插入一个id。
提供输入名称,例如patients[1][name]
。
然而,表单对象(ActiveModel)没有#id
方法,我得到NoMethodError
。即使它这样做也会给params
一个Hash,例如{ patients: { '1' => { name: 'foo' } } }
。
如果我只是form.fields_for 'patients', patient
,则所有输入都具有相同的名称,因此会在params
中相互覆盖。
答案 0 :(得分:0)
一种解决方案是在“表单对象”中添加“假”#id方法:
# form object (ActiveModel)
def id
SecureRandomn.hex(10)
end
这将提供如此命名的输入:patients[f0858de30df23c3e2305][name]
。
然后在控制器中我可以将params散列({ id => attributes, id => attributes, ... }
)转换为属性数组([attributes, attributes, ...]
):
虽然我不介意“修复”params太多,但在表单上添加一个无用的#id方法似乎太多了。