Рельсы - Вложенная форма - 2 уровня

Я хочу построить форму, следуя этой идее:

  • У меня есть модели Assignment, Activity, Task, AssignmentActivity, ActivityTask и AssignmentActivityTask.
  • В 1 задании много действий, а в 1 задании много задач.

    • (there's a many-to-many relation between:
      • Assignment - Activity
      • AssignmentActivity - Задача,
    • and a One-to-many relation:
      • Activity - Task)

Я создал форму Assignment-Activity, используя эту идею: 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%>

Но я не уверен, как написать строку после комментария.

Поэтому, когда он сохраняется, он должен сохранять внутри задания действия, а также задачи.

Есть ли способ сделать это?

заранее спасибо

Хавьер Кью


person JavierQQ23    schedule 21.02.2012    source источник


Ответы (3)


Вы можете попытаться передать идентификатор назначения в качестве параметров и использовать вспомогательный метод для сохранения объектов в нескольких моделях. В 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 попробуйте реализовать метод, называемый распространением:

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

Надеюсь это поможет.

person Marshall Shen    schedule 21.02.2012
comment
Есть ли документация или примеры? Спасибо - person JavierQQ23; 22.02.2012
comment
api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html В документе есть сеанс под названием «Примеры вложенных атрибутов», и вместо вызова вспомогательного метода вы можете использовать блок кода внутри, который может выполнять работу. - person Marshall Shen; 23.02.2012
comment
Я имею в виду распространение определения, потому что я этого не понимаю :) - person JavierQQ23; 27.02.2012

Я бы рекомендовал nested_forms от ryanb. Он позаботится о том, что вы хотите сделать очень хорошо и очень быстро.

person Marc    schedule 21.02.2012

Вам не нужно использовать какие-либо внешние библиотеки, потому что Rails прекрасно обрабатывает вложенные формы.

Освойте использование fields_for, и ваши проблемы будут решены.

person cmrichards    schedule 21.02.2012
comment
вот в чем проблема... если положить внутрь первой формы, то поле fields_for Nothing появится - person JavierQQ23; 22.02.2012