Rails - вложенная форма - 2 уровня - PullRequest
2 голосов
/ 21 февраля 2012

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

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

    • (существует отношение многие ко многим между:
      • Назначение - действие
      • AssignmentActivity - Задача,
    • и отношение «один ко многим»:
      • Активность - Задание)

Я создал форму 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%>

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

Так что когдаон сохраняет, он должен сохранять в задании действия, а также задачи

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

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

Хавьер QQ

Ответы [ 3 ]

0 голосов
/ 22 февраля 2012

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

0 голосов
/ 22 февраля 2012

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

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

0 голосов
/ 21 февраля 2012

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

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

...