Ruby on rails Rails动态多模型表单属性

Ruby on rails Rails动态多模型表单属性,ruby-on-rails,Ruby On Rails,这个问题一直折磨着我。我和Ryan Bates玩过复杂的表单,但我不能完全解决我的问题。 我有这个模式: Location has_many :targets Target has_many :target_classifications 页面上显示了所有位置。用户可以通过jscript动态地为任何位置创建一个目标,然后在位置3 select下添加一个表行(其中包含目标的可用分类)和一个目标值。在单击“保存”之前,可以为任何位置创建任意数量的目标。 我正在使用rjs渲染目标_部分,其代码如下:

这个问题一直折磨着我。我和Ryan Bates玩过复杂的表单,但我不能完全解决我的问题。 我有这个模式:


Location has_many :targets
Target has_many :target_classifications
页面上显示了所有位置。用户可以通过jscript动态地为任何位置创建一个目标,然后在位置3 select下添加一个表行(其中包含目标的可用分类)和一个目标值。在单击“保存”之前,可以为任何位置创建任意数量的目标。
我正在使用rjs渲染目标_部分,其代码如下: 我使用字段_的方式如下:



对于每个选择。当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”=>[{“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"]} ] } “新的_目标”=> {"7"=>[ {“目标”=>[{“id”=>“13”}、{“id”=>“15”}、{“吨”=>“67”} ], "4"=>[ {“目标”=>[{“id”=>“12”}、{“id”=>“15”}、{“吨”=>“23”]}, {“目标”=>[{“id”=>“11”},{“id”=>“16”},{“吨”=>“67”]} ] }
因此,我可以在每个位置遍历每个目标。我似乎无法在我的字段中为方法添加新的[target]括号(它爆炸了),但这正是我想做的。有什么想法吗?

这里讨论了这类问题:

但这似乎是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应该有某种方法自动为我做到这一点。

这里讨论了这类问题:

但这似乎是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应该有一些方法可以自动为我这样做

我不知道您是否正在这样做,但是在使用字段时,您需要指定一个字符串而不是对象。我看不到您的部分中的代码,所以我可能会有点偏离。一个哎呀,我的做法是在助手中:

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

我不知道您是否正在执行此操作,但在使用字段\时,您需要指定一个字符串而不是对象。我看不到您的部分中的代码,因此我可能有点不对劲。无论如何,我这样做的方式是在帮助器中:

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

简单。查找
接受
:)的嵌套属性。

简单。查找
接受
:)的嵌套属性。

@brad:我不确定,但我认为这些字段中的“[]”会起到你想要的作用want@brad:我不确定,但我认为这些“[]”在fields_for will do you wants中,我提到rails 2.3目前不适合我。因此,这不起作用,因为我提到rails 2.3目前不适合我。因此,这不起作用