如何在Rails 3中定位嵌套表单元素

3
我将翻译如下:

我正在创建一个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 %>

我知道这段伪代码不是完全有效的。

我正在使用Cocoon处理嵌套表单。我之前使用Ryan的nested_forms,但是因为Cocoon似乎更能处理这个问题,所以我切换了。

我想在表格中显示任务,类似于:

<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 %>

我希望能帮助您翻译IT技术相关内容。以下是需要翻译的内容:

我在将新任务插入到布局的正确位置时遇到了问题。这是因为视图中每个项目下面都会有多个任务表。

我意识到可以使用脚本来指定添加字段的位置:

$(function() {
    $("a.add_fields.").
      data("association-insertion-position", 'after').
      data("association-insertion-node", '.tasks tr:last');
});

但是我不知道如何传递任务所属的项目。例如,如果我有两个项目,并尝试添加任务到第二个项目,字段当前正在添加到第一个项目中。(但是,保存后它们与第二个项目正确关联,这仅仅是布局问题)。
有人遇到过这个问题吗?是否有更好的选择器可用于“association-insertion-node”?我欢迎任何提示或建议。
谢谢!!
更新
我仍然没能找到解决方案。本质上,我想做的是将嵌套的子元素(包含在块中)添加到父表单中。我一直无法使其按照我想要/期望的方式工作。
作为临时解决方案,我现在在
  • 块内呈现子元素。每个子元素都包含一个完整的块。从格式上来说,这并不是最理想的,但这是我能想出的最好的方法。

    我将保留这个问题,至少暂时保留,希望有人能提供更好的解决方案。感谢所有回复过我的人。

  • 你尝试过将项目ID附加到每个表的类中吗?类="project_#{project.id}" 并将project.id也附加到数据属性中? - fatfrog
    谢谢fatfrog,这正是我需要做的,但我无法弄清楚显示project.id的语法。您的示例在HTML标记中返回#{project.id}。我需要在其中放一些erb,但进展缓慢,无法找出有效的语法。有什么想法吗? - Andy Harvey
    嗨@fatfrog,使用这种方法,我如何处理新记录?例如,假设我创建了一个新项目,然后需要创建3个任务,直到保存之前该项目将没有ID,对吗? - Andy Harvey
    嗨@fatfrog,我刚试了一下dom_id。不幸的是,它的行为方式与project.id类似,如果我创建多个新项目,它们都将具有相同的ID-“new_project”。我想解决这个问题的唯一方法就是在单击add_new_project时运行一个JavaScript函数,保存所有项目,然后再打开新项目?除非我漏掉了什么。 - Andy Harvey
    我没有意识到你会有多个未保存的项目 - 你不能让它工作可能是一件好事 :) 你可以尝试在项目表上添加一个名为“temp”的布尔值,该值在创建时自动分配为true,并立即创建表。然后,创建的第一个任务将在保存后将Temp布尔值更改为false。 - fatfrog
    显示剩余2条评论
    2个回答

    0

    我不知道你的表格是如何显示的,而且我的JS有点生疏,但你可以像这样在link_to中传递一个数据属性:

    <%= 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。

    0

    我没有找到解决这个问题的简单方法。

    最终,我不得不用自定义函数覆盖cocoon的javascript,该函数基本上构造一个新的关联对象名称,并将新的关联对象附加到现有序列中。

    这不是一个简单的解决方案。我会与Cocoon的开发人员分享它,也许可以更新gem以提供此功能。

    感谢您的建议。


    我非常想看看你做了什么,从解释上来看,它对我来说并不完全清楚。将它包含在 gem 中可能会很有趣。 - nathanvda
    嗨,nathanvda,我会给你发送代码链接,抱歉我忘记了! - Andy Harvey

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接