我无法让fields_for
处理非ActiveRecord模型的Array属性。
蒸馏下来,我必须遵循:
模型/ parent.rb
class Parent
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
extend ActiveModel::Translation
attr_accessor :bars
end
控制器/ parent_controller.rb
def new_parent
@parent = Parent.new
@parent.bars = ["hello", "world"]
render 'new_parent'
end
视图/ new_parent.html.haml
= form_for @parent, :url => new_parent_path do |f|
= f.fields_for :bars, @parent.bars do |r|
= r.object.inspect
使用上面的代码,我的页面包含["hello", "world"]
- 即inspect
调用分配给bars
的数组的结果。 (@parent.bars
行中省略fields_for
,我只显示nil
。
如何让fields_for
表现为AR关联 - 也就是说,对我的bars
数组的每个成员执行一次代码?
答案 0 :(得分:11)
我认为正确的技术是:
= form_for @parent, :url => new_parent_path do |f|
- @parent.bars.each do |bar|
= f.fields_for "bars[]", bar do |r|
= r.object.inspect
为什么它不能用于工作我不确定,但这似乎可以解决问题。
答案 1 :(得分:1)
我认为可以在不需要的情况下完成:
= form_for @parent, :url => new_parent_path do |f|
= f.fields_for :bars do |r|
= r.object.inspect
您需要设置父类中预期的一些方法来标识集合。
class Parent
def bars_attributes= attributes
end
end
您还需要确保数组中的对象响应持久化(因此您不能使用字符串):(
答案 2 :(得分:0)
我抛弃了fields_for并添加了多个:true
= form_for @parent, :url => new_parent_path do |f|
- @parent.bars.each_with_index do |bar, i|
= f.text_field :bars, value: bar, multiple: true, id: "bar#{i}"