在Rails 5中使用fields_for的ActiveModel表单

时间:2017-12-11 13:20:20

标签: ruby-on-rails ruby-on-rails-5

我有一个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中相互覆盖。

1 个答案:

答案 0 :(得分:0)

一种解决方案是在“表单对象”中添加“假”#id方法:

# form object (ActiveModel)
def id
  SecureRandomn.hex(10)
end

这将提供如此命名的输入:patients[f0858de30df23c3e2305][name]

然后在控制器中我可以将params散列({ id => attributes, id => attributes, ... })转换为属性数组([attributes, attributes, ...]):

参数[:患者]。值

虽然我不介意“修复”params太多,但在表单上添加一个无用的#id方法似乎太多了。