W instrukcji napisane jest
Add ActAsTree to the model
app/models/category.rb
class Category “name”
end
Moj model wyglada tak
class Category < ActiveRecord::Base
has_many :ads
ActAsTree
validates :title, :presence => true
end
Ale wydaje mi sie ze cos jest nie tak bo dalej jak dodam do seed.rb to co jest w instrukcji wywala blad przy rake db:seed uninitialized constant Category::ActAsTree
Chcialbym wyswietlic Katoegorie w drzewie moze jest jakis inny lepszy sposob? Probowalem tez http://railscasts.com/episodes/162-tree-based-navigation
Ale po wydaniu komendy rails plugin install git://github.com/rails/acts_as_tree.git Wyglada jakby instalacja nie zostala przeprowadzona. Dodaje potem acts_as_tree do category.rb i znow wywala blad.
Jakies wskazowki?
Pierwsza podkategorie tworze bez problemow klikajac w link_to subcategory natomiast gdy chce dodac podkategorie do podkategorii gdy klikam w ten sam link nie wybiera mi automatyczne kategoii. Czy to dla tego ze ta kategoria nie moze byc rodzicem poniewaz ma juz rodzica? Jak w takim razie dodac kolejna podkategorie?
Udalo mi sie wyswietlic drzewo kategorii ale tylko pierwsze dwa poziomy.
Wyswietlam roots i children w taki sposob:
<ul id="menu">
<% Category.roots.each do |category| %>
<li> <%= link_to h(category.title), category %> (<%= category.ads.count %>)
<% unless category.children.empty? %>
<ul id="sub-menu">
<% category.children.each do |subcategory| %>
<li><%= link_to h(subcategory.title), subcategory %></li>
<% end %>
</ul>
<% end %>
</li>
<% end %>
</ul>
Czy aby stworzyc kolejny poziom “Poziom2” czyli
PoziomRoot
Poziom1
– Poziom2
Moge stworzyc kolejna kategorie wybierajac parent jako Poziom1 ? Jesli tak to w jaki sposob zmodyfikowac widok aby pokazywal ten “Poziom2” ?
Jeżeli chcesz wyświetlić pełne drzewo, niezależnie od tego ile toto ma poziomów, najłatwiej chyba zdefiniować rekurencyjną funkcję - albo jako metodę modelu, albo jako metodę w helperze widoku.
def category_list_item(category)
link_to( h(category.title), category ) + " (#{category.ads.count})"
end[/code]
Nie testowałem, nie sprawdzałem, pisałem z niczego, czyli z głowy. Ale idea powinna być widoczna.
Aha - nie używaj id w podliście - id w obrębie dokumentu HTML ma być unikalne. Albo użyj klasy (pewnie tego właśnie chciałeś użyć) albo budując HTML-owe ID użyj np. id modelu:
Dzieki!
Wyglada na to ze mam gdzies blad w kodzie. Po stworzeniu kolejnego poziomu nie jest on widoczny.
Dokladniej i z przykladem
Mam PoziomRoot tworze Podkategoria1 jest ok. Tworze kolejna kategorie i wybieram parent_id jako Podkategoria1 i nazwe jako Podkategoria2.
W akcji show chce wyswietlic
<% unless @category.children.empty? %>
<ul id="sub-menu">
<% @category.children.each do |subcategory| %>
<p>Dzieci: <%= subcategory.title %></p>
<% end %>
</ul>
<% end %>
Jak jestem w PoziomRoot wyswietla dzieci jako Podkategoria1. Jak jestm w Podkategoria1 nie wyswietla dzieci.
W categories_controller.rb
...
def new
@category = Category.new(:parent_id => params[:parent_id])
...
Wyglada to jakbym okreslal ze dla Podkat.2 rodzicem jest Podkat1 ale Podkat2 nie koniecznie jest dzieckiem Podkat.1. Dziwne czy tak ma byc?
Zaraz… Pokazałeś akcję :new, a nie :create. Jeżeli utworzyłeś @category, to przecież ona nie ma żadnych dzieci. Czy na pewno wyświetlasz dobry obiekt? Czy jesteś pewny, że wyświetlany obiekt MA dzieci? Twierdzisz, że w bazie wszystko jest OK, ale sprawdź, czy gdzieś nie ma jakiejś literówki, czy w konsoli rzeczywiście relacje działają w obie strony - a.children.first.parent == a itp. Gdzieś musisz pewnie mieć jakiś źle postawiony przecinek…
Sorry, za takie insynuacje, ale kiedy rzeczy zaczynają być dziwne, trzeba zacząć sprawdzać od tego co wydaje się oczywiste - czy włożyłem wtyczkę do prądu?
Pozniej to usunalem i zapomnialem. Ale juz z tym kodem w momencie tworzenia poziomu 2 nie wybieralo za pomoca id automatycznie kategorii rodzica. Dzialo sie tak tylko na etapie pierwszej podkategorii. Tak wyglada form
<%= form_for(@category) do |f| %>
<% if @category.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@category.errors.count, "error") %> prohibited this category from being saved:</h2>
<ul>
<% @category.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :ancestry %><br />
<%= f.collection_select :ancestry, Category.all(:order => "title"), :id, :title, :include_blank => true %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
W bazie mialem ancestry gdzie zapisywane byly id rodzicow.
Root(id=3)
-Poziom1(id=5)
–Poziom2(id=6)
…
W momencie gdy chcialem stworzyc Poziom2 ustawialem rodzica jako Poziom1 a w bazie zapisywal tylko id Poziom1 a powinien rowiez Root. Po zmianie w bazie zapisywane sa oba id oddzielone “/” Wyglada to tak Poziom2 anestry = 3/5
Dziekuje za wszelkie proby pomocy i pozdrawiam!