我有个问题:
我的web应用程序有一个表单,用户可以在其中自定义他们的配置文件。在每个配置文件中可以指定多个技能,我希望允许用户按一个按钮(添加新技能),以便指定他们想要的多少技能。这是控制器代码:
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%>这个表单很好地显示了用户的每一项技能,它允许编辑等等。现在的问题是,我想添加一个链接到“添加新技能”,所以一个更改表单和添加新技能输入字段的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" /> 有什么主意或解决办法吗?谢谢
发布于 2011-05-02 17:57:56
fields_for创建一个字段数组。名称中的"0“表示数组中的索引。由于您正在创建新的记录,您可以简单地忽略隐藏的id字段。
因此,通过javascript,您只需要做两件事: 1.计算子集合的现有输入数,以获得新的索引。2.使用新索引添加一个新的文本字段。
使用通配符选择器(如$(‘inputname$=“]).length;检索计数(用于新索引),这相对容易。如果您有另一个包含名称字段的数组字段,则可能需要使用regex选择器(通过插件)。一种更简单的方法可能是在每个技能名称输入中添加一个类,并在计数时使用该类作为选择器。
若要追加新输入,请参阅:
http://api.jquery.com/append/
如果您不使用jquery,那么它在其他框架中应该是相似的,只需稍微谷歌一下。
发布于 2011-05-02 19:16:01
我编写了一个gem,它可以使动态处理嵌套表单更容易:茧。gem与标准的rails格式化程序一起工作,但也与Fortastic或simple_form一起工作。
我还建议您结帐表单或simple_form,因为这些是令人敬畏的宝石,使表单处理更容易。但与HAML一样,这是个人的选择。
https://stackoverflow.com/questions/5859137
复制相似问题