Rails — используйте ту же форму с новым/редактированием, используя fields_for

У меня есть 5 моделей,

  1. Человек
  2. человек_автомобиль
  3. автомобиль (имеет много шин)
  4. person_car_tire
  5. шина (принадлежит машине)

поэтому у меня есть это представление _form.html.erb

<%= form_for(@person) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div>

  <% Car.all.each do |c|%>
  <div class="field">
    <%= f.fields_for(:person_cars) do |ff|%>
      Car Name:   <%= ff.check_box :car_id %>|<%= c.car_name%>
      <% c.tires.each do |b|%>
      <div class="field">
        <%= ff.fields_for(:person_car_tires) do |fff|%>
          Tire: <%#= fff.check_box :tire_id%>|<%= b.tire_name%>
        <%end%>
      </div>
      <%end%>
    <%end%>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

И когда я сохраняю, он работает отлично, проблема возникает, когда я хочу редактировать с помощью этой формы, потому что она дублирует данные каждой машины 4 раза в представлении. Я искал и поля для дополнительных опций, поэтому я сделал:

<%= form_for(@person) do |f| %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div>

  <% @person.cars.each do |c|%>
  <div class="field">
    <%= f.fields_for(:person_cars, c) do |ff|%>
      Actividad:   <%= ff.check_box :car_id %> | <%= c.car.name%>
      <% c.person_car_tires.each do |t|%>
      <div class="field">
        <%= ff.fields_for(:person_car_tires, t) do |fff|%>
          Tarea: <%#= fff.check_box :tire_id%>|<%#= t.tire.name%>
        <%end%>
      </div>
      <%end%>
    <%end%>
  </div>
  <%end%>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

и теперь это работает, но показывает только автомобили и шины, которые я выбрал в новом действии. не все, как я хотел (потому что, если я использую первую форму, она дублирует флажки в представлении).

Как я могу использовать одну и ту же форму для обоих действий?

Надеюсь, кто-нибудь может мне помочь.


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


Ответы (1)


Вы можете использовать один и тот же партиал _form как для нового, так и для редактирования. Вам просто нужно передать в эту форму локальные переменные с разными значениями. По сути, все, что отличается, абстрагируйте его как параметр (локальную переменную) для этого частичного, похожего на функцию.

person Salil    schedule 28.05.2012