Rails问题accepted_nested_attributes_for

时间:2011-05-02 15:38:58

标签: javascript ruby-on-rails model nested-forms nested-attributes

我有这个问题:

我的网络应用程序有一个表单,用户可以在其中自定义其个人资料。 在每个配置文件中可以指定许多技能,我希望允许用户按下一个按钮(添加新技能),以指定他们想要的尽可能多的技能。 所以这是控制器代码:

  accepts_nested_attributes_for :skills, :allow_destroy=>true, :reject_if => lambda {|a| a[:name].blank?}

这是表单(只是具有嵌套属性技能的部分):

<%= f.fields_for :skills do |builder|%>

    <div class="field">

        <%= builder.label :skill %>
        <%= builder.text_field :name%>
                <%= builder.hidden_field :_destroy %>

                <%= link_to 'remove', '#', :onclick=>'removeField()'%>
    </div>
                  <%end%>

此表单完美运行并显示用户的每项技能,它允许编辑等。现在的问题是,我想添加一个链接到&#34;添加新技能&#34;所以改变形式的javascript函数和添加新技能输入字段,我真的不知道如何行动,主要是因为嵌套属性在我不喜欢的形式中具有特定的id和名称;了解:

<input id="profile_skills_attributes_0_name" name="profile[skills_attributes][0][name]" size="30" type="text" value="Mathematicansszz" /> 

它还添加了另一个带有技能id的隐藏输入字段(无法预测是否未创建技能),无法从HTML静态页面创建新技能?

 <input id="profile_skills_attributes_0_id" name="profile[skills_attributes][0][id]" type="hidden" value="3" /> 

任何想法或解决方法?谢谢

2 个答案:

答案 0 :(得分:1)

我编写了一个可以处理的gem,可以更轻松地处理嵌套表单:cocoon。 宝石可以使用标准的rails formhelper,也可以使用formtastic或simple_form。

我还建议您查看formtastic或simple_form,因为这些是令人敬畏的宝石,使表单处理更容易。但与HAML一样,这是个人选择。

答案 1 :(得分:0)

fields_for创建一个字段数组。名称中的“0”表示数组中的索引。由于您正在创建新记录,因此您可以忽略隐藏的ID字段。

所以通过javascript你只需要做两件事: 1.计算子集合的现有输入数量,以获取新索引。 2.使用新索引添加新文本字段。

使用通配符选择器(如$('input [name $ =“] [name]”]'),使用jQuery相对容易。检索计数(对于新索引)。如果您有另一个带有名称字段的数组字段,则可能需要使用正则表达式选择器(通过插件)。一种更简单的方法可能是在每个技能名称输入中添加一个类,并在计数时将该类用作选择器。

要附加新输入,请参阅:

http://api.jquery.com/append/

如果你没有使用jquery,那么在其他框架中它应该与google搜索相似。