2009-03-05 77 views
2

这个问题一直在杀我。我玩了瑞恩贝茨复杂的形式,但我无法弄清楚我的问题。 我有这个模式:Rails动态多模型表单属性


Location has_many :targets 
Target has_many :target_classifications

所有位置都显示在页面上。用户可以通过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方法中添加一个新的[目标]大括号(它爆炸了),但这就是我想要做的。有什么想法吗?

回答

0

这类问题是在这里讨论:

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

但它似乎是一个轨道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]" /> 

只是一些方法来创建每个目标的唯一标识符(或在这种情况下,小部件的属性),我想补充。 jscript增加了一个新的目标,这是一种艰难的行为。我觉得应该有一些方法让钢轨自动为我做这个

1

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

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

@brad:我不确定,但我认为fields_for中的这些“[]”会做你想做的事 – klew 2009-03-22 16:21:48

-1

很容易。看起来accepts_nested_attributes_for。 :)

+0

正如我所提到的,rails 2.3目前不适合我。所以这是行不通的 – brad 2009-07-30 13:39:30