Ruby on rails Rails动态多模型表单属性
这个问题一直折磨着我。我和Ryan Bates玩过复杂的表单,但我不能完全解决我的问题。 我有这个模式: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渲染目标_部分,其代码如下:
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目前不适合我。因此,这不起作用