Rails Dynamic Multi Model Form属性

时间:2009-03-05 19:52:52

标签: ruby-on-rails

这个问题一直在扼杀我。我和Ryan Bates的复杂形式一起玩,但我无法弄清楚我的问题。 我有这个架构:


Location has_many :targets
Target has_many :target_classifications

页面上显示所有位置。用户可以通过jscript动态地为任何位置创建目标,然后jscript在位置3选择(包含对目标的可用分类)和目标值下添加表行。在单击保存之前,可以为任何位置创建任意数量的目标 我正在使用rjs来渲染一个target_partial,它有以下代码: 我正在以这种方式使用fields_for:



每个选择

。当sumbmitted时,我得到这个哈希:

"new_targets"=>
  {"7"=>[{"id"=>"13"}, {"id"=>"15"}, {"value"=>"67", "id"=>""}],
   "4"=>
    [{"id"=>"12"},
     {"id"=>"15"},
     {"value"=>"23", "id"=>""},
     {"id"=>"11"},
     {"id"=>"16"},
     {"value"=>"67", "id"=>""}]},

因此,它按位置(在这种情况下为“7”和“4”)分隔每个目标,但不分隔每个目标。我想要的是这个:

"new_targets"=>
  {"7"=>[
          {"target"=>[{"id"=>"13"}, {"id"=>"15"}, {"tonnes"=>"67"}]}
        ],
   "4"=>[
          {"target"=>[{"id"=>"12"},{"id"=>"15"},{"tonnes"=>"23"]},
          {"target"=>[{"id"=>"11"},{"id"=>"16"},{"tonnes"=>"67"]}
        ]
  }

所以我可以遍历每个位置的每个目标。我似乎无法在我的field_for方法中添加一个新的[target]大括号(它爆炸了),但这就是我想做的事情。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我不知道你是否这样做,但是在使用fields_for时你需要指定一个字符串而不是对象。我看不到你的部分代码,所以我可能会离开。无论如何,我这样做的方式是帮助:

def fields_for_target(target, &block)
  prefix = target.new_record? ? 'new' : 'existing'
  fields_for("location[#{prefix}_target_attributes][]", target, &block)
end

答案 1 :(得分:0)

这里讨论了这类问题:

  

http://wonderfullyflawed.com/2009/02/17/rails-forms-microformat/

但它似乎是一个rails 2.3解决方案(对我来说不是一个选项)。基本上,我想要一个他们在网站上发布的表格:

<input name="creator[widget_attributes][0][id]" />
<input name="creator[widget_attributes][0][name]" />
<input name="creator[widget_attributes][0][price]" />

<input name="creator[widget_attributes][1][id]" />
<input name="creator[widget_attributes][1][name]" />
<input name="creator[widget_attributes][1][price]" />

为我想添加的每个目标(或者在本例中为widget属性)创建唯一标识符。鉴于jscript添加了新目标,这种做法很难实现。我觉得应该有一些方法让rails自动为我做这个

答案 2 :(得分:-1)

易。查看accepts_nested_attributes_for。 :)