2012-02-22 184 views
2

一直在搜索,但我找不到任何帮助。我试图动态添加字段到我一直在创建的嵌套窗体。当前的代码是:Rails中的嵌套窗体

控制器

if @jobstream.complex_attributes == []  
     @functional_group.functional_type_stores.each do |ftype| 
       if(Type.find(ftype.type_id).simple_or_complex == 'C' || Type.find(ftype.type_id).simple_or_complex == 'c') 
        @jobstream.complex_attributes.build(:type_id => Type.find(ftype.type_id).id) 
       end 
     end 
end 

<%= f.fields_for :complex_attributes do |f_sa| %> 
    <tr> 
     <div class="field"> 
      <td><%= @complexType[@counter].display_name %></td> 
      <td><%= @complexType[@counter].simple_or_complex %></td> 
      <%= f_sa.hidden_field :type_id%> 
      <td><%= f_sa.text_field :content, :size => 100 %></td> 
     </div> 
    </tr> 
    <% (@counter += 1) %> 
<% end %> 

我需要的是能够另一个文本字段动态地添加到复杂的属性,同时创造一个方法复杂属性的唯一标识,并且还保留您希望添加更多字段的复杂属性的值hidden_field type_id

想要快速参考,希望解释这个更好去here和命中创建jobstream - 我基本上想要能够拥有一个复杂的属性列表旁边的按钮,允许您添加更多的文本字段为相同的属性。

回答

0

由于您无法将更多属性对添加到现有模型(超过db中的字段),您可能需要创建@jobstream模型所拥有的另一个模型。这个新模型将存储属性,并且必须使用@jobstream模型来调用。

在表单中,您必须远程添加字段,并且为了避免错误,您需要使用Model.create而不是Model.new(否则嵌套窗体将崩溃)。另外,您需要为每个添加的字段添加新的fields_for标记。

这将是Rails的方式,我猜。

您也可以尝试这些新的属性是哈希存储在指定的领域 - 例如,你可以有一个像

<%= fields_for :complex_attributes, do |f| %> 
<%= f.text_field :attr_foo %> 
<%= f.text_field :attr_new %> 
<%= f.text_field :another_attr_new %>... 

字段,然后更新表格后,您可以通过使用Model.complex_attributes.each_pair do |key, value| 问题检索这些属性这里是添加更多字段,您可能需要对这些字段进行硬编码,并且还必须为每个新字段分配新密钥。

虽然它可以做到。我猜:)

+0

听起来不错,我会试试看 – 2012-02-22 12:56:41