Rails 3.1 act_as_tree - определить детей?на объекте FormBuilder - PullRequest
0 голосов
/ 07 октября 2011

Я пытаюсь понять, как лучше всего это сделать. Мне нужно развернуть рекурсивно через модель act_as_tree (MenuHeader ниже). У меня есть следующие модели:

class Menu < ActiveRecord::Base
  has_many :menu_headers
  accepts_nested_attributes_for :menu_headers
end

class MenuHeader < ActiveRecord::Base
  belongs_to :menu
  acts_as_tree :parent_id
  has_many :menu_items
  accepts_nested_attributes_for :menu_items
end

class MenuItem < ActiveRecord::Base
  belongs_to :menu_header
  has_one :price
end

Я бы хотел перебрать все заголовки menu_headers таким образом, чтобы:

menu-1
  menu_header -1
      menu_item - 1
      menu_item - 2
    menu_header -2
        menu_item - 3
        menu_item - 4
  menu_header -3
      menu_item - 5
    menu_header - 4
      menu_header - 5
          menu_item - 6
          menu_item - 7

и фактическая форма (см. ### вопрос)

<%= form_for(@menu) do |f| %>
  <div class="actions">
    <%= f.text_field :content %><br />
    <%= f.fields_for :menu_headers do |mh| %>
      <%=mh.text_field :name %><br />
      <%= mh.fields_for :menu_items do |mi| %>
        <%= mi.text_field :name %><br />
      <% end %>
  <% ### wtf? - the next section should include the above frag in a partial %>
      <% if fields_for :children? %>
          <%= partial 'children' %>
      <% end %>
    <% end %>
    <%= f.submit %>
  </div>
<% end %>

Как мне сделать вышеуказанную часть? Мне нужно проверить, есть ли дети на объекте FormBuilder (я думаю). Впервые делаю что-то подобное в Rails.

1012 * ТНХ *

РЕДАКТИРОВАТЬ # 1 похоже, что-то вроде этого является частью этого (но не почти вся часть):

<%  if mh.object.children.exists? %>
    <%= render :partial => 'children' %>
<% end %>

РЕДАКТИРОВАТЬ # 2 Итак, я получаю дубликат рендеринга одного из детей. Я включил то, что происходит ниже

должно быть (заголовки меню с отступом 2 пробела, пункты меню 4 пробела):

menu 1
  mh 1, parent_id=nil
      mi 1 - fk menu_header 1
  mh 2 - parent_id=nil
      mi2 - fk menu_header_id=2
      mi3 - fk menu_header_id=2
    mh 3 parent_id=2 
        mi 4, menu_header_id=3
    mh 4 parent_id=2 
      mh 5 parent_id=4
        mi 5, menu_header_id=5
      mh 6 parent_id=5

получение со значениями формы в родителях - дублируется второй заголовок меню # 4

menu 1 - menu[content]
mh 1, parent_id=nil - menu[menu_header_attributes][0][name]
    mi 1 - fk menu_header 1 - menu[menu_headers_attributes][0][menu_items_attributes][0][name]
mh 2 - parent_id=nil - menu[menu_headers_attributes][1][name]
    mi2 - fk menu_header_id=2 - menu[menu_headers_attributes][1][menu_items_attributes][0][name]
    mi3 - fk menu_header_id=2 - menu[menu_headers_attributes][1][menu_items_attributes][1][name]
  mh 3 parent_id=2 - menu[menu_headers_attributes][1][children_attributes][0][name]
      mi 4, menu_header_id=3 - menu[menu_headers_attributes][1][children_attributes][0][menu_items_attributes][0][name]
  mh 4 parent_id=2 menu[menu_headers_attributes][1][children_attributes][1][name]
    mh 5 parent_id=4 menu[menu_headers_attributes][1][children_attributes][1][children_attributes][0][name]
        mi 5, menu_header_id=5 menu[menu_headers_attributes][1][children_attributes][1][children_attributes][0][menu_items_attributes][0][name]
    mh 6 parent_id=5 menu[menu_headers_attributes][1][children_attributes][1][children_attributes][0][children_attributes][0][name]
  mh 4 parent_id=2 menu[menu_headers_attributes][2][name]
    mh 5 parent_id=4 menu[menu_headers_attributes][2][children_attributes][0][name]
        mi 5, menu_header_id=5 menu[menu_headers_attributes][2][children_attributes][0][menu_items_attributes][0][name]
      mh 6 parent_id=5 menu[menu_headers_attributes][2][children_attributes][0][menu_items_attributes][0][name]
    mh 5 parent_id=4 - menu[menu_headers_attributes][3][name]
        mi 5, menu_header_id=5 - menu[menu_headers_attributes][3][menu_items_attributes][0][name]
      mh 6 parent_id=5 menu[menu_headers_attributes][3][children_attributes][0][name]

Глядя на то, что здесь происходит - это похоже на children_attributes, которые несколько опасны. Любые идеи, основанные на коде, что происходит? Надо сказать, что обновления происходят Ура!

1 Ответ

1 голос
/ 07 октября 2011

Упс, неправильно прочитайте это.

Я полагаю, <%= mh.object.children %> даст вам набор прямых детей, вам нужно будет рекурсивно вызывать <%= mh.object.children %> для каждого соответствующего ребенка (в вашем патиале), чтобыполучить все дерево.

Возможно, вы могли бы accepts_nested_attributes_for :children позволить вам установить их атрибуты.

РЕДАКТИРОВАТЬ Как насчет этого подхода:

<%= form_for(@menu) do |f| %>
  <div class="actions">
    <%= f.text_field :content %><br />
    <%= f.fields_for :menu_headers do |mh| %>
      <%= render :partial => 'menu_headers/form', :object => mh %>
    <% end %>
    <%= f.submit %>
  </div>
<% end %>

app/views/menu_headers/_form.html.erb

  <%= form.text_field :name %><br />
  <%= form.fields_for :menu_items do |mi| %>
    <%= mi.text_field :name %><br />
  <% end %>

  <%= form.fields_for :children do |mh| %>
     <%= render :partial => 'form', :object => mh %>
  <% end %>

и добавьте:

accepts_nested_attributes_for :children к вашей MenuHeader модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...