Я пытаюсь понять, как лучше всего это сделать. Мне нужно развернуть рекурсивно через модель 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, которые несколько опасны. Любые идеи, основанные на коде, что происходит? Надо сказать, что обновления происходят Ура!