form_for非AR模型 - fields_for数组属性不会迭代

时间:2011-11-25 16:37:58

标签: ruby-on-rails-3 activemodel

我无法让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数组的每个成员执行一次代码?

3 个答案:

答案 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}"