我正在创建一个Rails 3应用程序,该应用程序使用具有两级嵌套属性的嵌套表单,即
<%= form_for @workareas do |f| %>
<%= f.text_field :workarea_name %>
<%= f.fields_for :projects do |project| %>
<%= f.text_field :project_name %>
<%= f.fields_for :tasks do |task| %>
<%= f.text_field :task_name %>
<%= f.check_box :complete %>
<%= f.check_box :urgent %>
<%= f.check_box :today %>
<% end %>
<% end %>
<% end %>
(我意识到这个伪代码不是100%有效的)
我正在使用茧来处理嵌套表单。我使用了Ryan的嵌套表单,但由于Coccon似乎能够更好地处理这个问题,所以我进行了切换。
我想在一个表中显示任务,类似于:
<table class="tasks">
<tr>
<th><%= f.label :task_name %></th>
<th><%= f.label :complete %></th>
<th><%= f.label :urgent %></th>
<th><%= f.label :today %></th>
</tr>
<%= f.fields_for :tasks do |task| %>
<tr>
<td><%= f.text_field :task_name %></td>
<td><%= f.check_box :complete %></td>
<td><%= f.check_box :urgent %></td>
<td><%= f.check_box :today %></td>
</tr>
<% end %>
</table>
<%= link_to_add_association "New Task", f, :tasks %>
在布局的正确位置插入新任务时遇到问题。这是因为将有多个任务表,视图中每个项目下都有一个任务表。
我意识到我可以使用脚本来指定添加字段的位置:
$(function() {
$("a.add_fields.").
data("association-insertion-position", 'after').
data("association-insertion-node", '.tasks tr:last');
});
但是不知道如何传递任务属于哪个项目。例如,如果我有两个项目,并试图将任务添加到第二个项目,则字段当前正在添加到第一个项目。(保存时它们与项目2正确关联,但这纯粹是布局问题)。
以前有人遇到过这个问题吗?是否有更好的选择器用于"关联插入节点"。我欢迎任何意见或建议。
谢谢!!
更新
我仍然没有找到解决这个问题的办法。从本质上讲,我想做的是将包含在<tr>
块中的嵌套子元素添加到父窗体中。我无法按我希望/期望的方式进行此操作。
作为一个临时解决方案,我现在呈现<li>
块中的子元素。<li>
块包含用于每个孩子的完整的<table><tbody><tr>
块。就格式而言,这并不理想,但这是我所能想到的最好的。
我将暂时不提这个问题,希望有人能提供更好的解决方案。
感谢到目前为止所有回复的人。
我不知道你的表是如何显示的,我的JS有点生疏,但你可以在链接中传递一个数据属性,如下所示:
<%= link_to_add_association "New Task", f, :tasks, 'data-project_id' => "project_#{project.id}" %>
然后在你的功能中:
var project_id = $(this).data("project_id");
$("#" + project_id + " a.add_fields.").
他们这样做的一个很好的教程是在CodeSchool.com上使用jQuery Air:Captain's Log
我没有找到一个简单的方法来解决这个问题。
最后,我不得不用一个自定义函数来替代cocoon的javascript,该函数本质上构建了一个新的关联对象名称,并将新的关联目标附加到现有序列中。
这不是一个简单的解决方案。我将与Cocoon的开发人员分享它,也许gem可以更新以提供此功能。
谢谢你的建议。