Rails - 嵌套表单 - 2个级别

时间:2012-02-21 17:06:51

标签: ruby-on-rails ruby-on-rails-3 forms ruby-on-rails-3.1 nested-forms

我想按照这个想法建立一个表格:

  • 我有Assignment,Activity,Task,AssignmentActivity,ActivityTask和AssignmentActivityTask模型
  • 1个作业有很多活动,1个活动有很多任务

    • (之间存在多对多的关系:
      • 作业 - 活动
      • AssignmentActivity - 任务,
    • 和一对多的关系:
      • 活动 - 任务)

我使用这个想法制作了作业 - 活动表格: http://railscasts.com/episodes/17-habtm-checkboxes

,表格看起来像这样

_form.html.erb

<% form_for @assignment do |f|%>
  <% Activity.all.each do |a|%>
    <% check_box_tag "assignment[activity_ids][]", a.id,  @assignment.activity_ids.include?(a.id)%> | <% a.name%>
  <%end%>
<%end%>

因此它保存了作业,我检查过的所有活动。

当我尝试在此表单中添加保存任务的功能时出现问题。 这就是我试过的

_form.html.erb

<% form_for @assignment do |f|%>
  <% Activity.all.each do |a|%>
    <%= check_box_tag "assignment[activity_ids][]", a.id,  @assignment.activity_ids.include?(a.id)%> | <% a.name%> <br>
    <% a.tasks.each do |t|%>
      #THIS
      <% check_box_tag "assignment[activity_ids][][]", t.id, "Something here"%><br>
    <%end%>
  <%end%>
<%end%>

但我不确定如何在评论后写下这一行。

因此,当它保存时,它应该在分配中保存活动以及任务

有没有办法做到这一点?

提前致谢

Javier QQ

3 个答案:

答案 0 :(得分:0)

您可以尝试将赋值ID作为参数传递,并使用Helper方法将对象保存在多个模型中。在ActionView :: Helpers API中你有这样的东西:

check_box(object_name, method, options = {}, checked_value = "1", unchecked_value = "0")

所以也许在你的代码块中尝试这样的事情:

<% check_box_tag "assignment[activity_ids][][]", propagate(t.id)%>

在AssignmentHelper.rb中,尝试实现一个名为propagate的方法:

def propagate(id)
  *Fetch the id of Activity
  *Fetch the id of Task
  *Save both objects 
end

希望这有帮助。

答案 1 :(得分:0)

我推荐ryanb nested_forms。它会照顾你想要做的非常好而且非常快。

答案 2 :(得分:0)

您不需要使用任何外部库,因为Rails处理嵌套表单就好了。

熟悉使用fields_for,您的问题将被排序。