Rekurencja. Wyświetlanie zagnieżdżonej listy stron

Witam!

  1. W ramach nauki postanowiłem zrobić aplikację z zagnieżdżonymi stronami (tekie typowe drzewo kategorii). Z samym algorytmem nie miałem większych problemów, natomiast pojawiły się one gdy próbuję to jakoś wyświetlić na stronie zgodnie z wzorcem MVC.

Oczywiście mogę to zrobić brzydką metodą:

[code]def list_pages(id)
subpages = Page.find(id).subpages
@tekst += “


    for page in subpages
    @tekst += “
  • ” + page.title + “

  • list_pages(page.id)
    end
    @tekst += “

end

def all_pages
@tekst = String.new
@tekst += “


    for page in @main_pages
    @tekst += “
  • ” + page.title + “

  • list_pages(page.id)
    end
    @tekst += “

end[/code]
i wyświetlić @tekst, ale mnie to nie satysfakcjonuje.
  1. Dodatkowo chciałbym, aby adres url był w formie http://example.com/strona/podstrona/podpodstrona. Przeczytałem poradnik na http://apohllo.pl/guides/index.html, oglądnąłem screencasty dotyczące routes ale niestety nie znalazłem żadnych informacji.

Byłbym wdzięczny, gdyby ktoś mnie nakierował, niekoniecznie podał gotowe rozwiązanie - w końcu robię to tylko dla siebie :).

  1. Jak na mnie to taka metoda jest dobra, ale niezgodnie z MVC mieszasz kod w kontrolerze. Do tego celu użyłbym partial, do tego boje się że nie przeskoczysz rekurencji
<%= render :partial => "nodes", :object => @roots %>

i

[code=_nodes.html.erb]<% object.each {|node| %>

  • <%= node.title %>
  • <% unless node.childrens.empty? %>


      <%= render(:partial => “nodes”, :object => node.childrens) %>

    <% end %>

    <% } %>[/code]
    czyli w sumie to samo ale w widoku.

    1. To się da zrobić ale raczej pozbędziesz się REST.
      można na przykład tak:
    map.resources :page, :has_many => :childrens,  :class_name => 'Page', :as => :parent

    Ale co jeśli będziesz miał głębokość 3 i więcej?
    Możliwe jest aby rozwiązać to już w kontrolerze,

    map.resources :pages, :path_prefix => '/strony/:ciag_danych'

    i parsować “ciag_danych”. To nie jest dobre co podałem, więc to nie gotowiec :slight_smile: ale może pomogłem Ci choć trochę.

    Dzięki. Z tym partialem bym musiał długo kombinować, by na to wpaść ;p

    Co do dwójki: poszukam coś jeszcze na githubie, może jest jakiś ciekawy plugin do tego.