2010-04-01 14 views
7

Meine Modellklasse ist:Nested-Routing in Ruby on Rails

class Category < ActiveRecord::Base 
    acts_as_nested_set 
    has_many :children, :foreign_key => "parent_id", :class_name => 'Category' 
    belongs_to :parent, :foreign_key => "parent_id", :class_name => 'Category' 


    def to_param 
    slug 
    end 
end 

Ist es möglich, eine solche rekursive Strecke wie diese zu haben: /root_category_slug/child_category_slug/child_of_a_child_category_slug ... und so ein

Vielen Dank für jede Hilfe:)

+1

Große Frage. –

Antwort

4

Sie können tun, dass mit regelmäßigen Routen und Route Globbing, so zum Beispiel

map.connect 'categories/*slugs', :controller => 'categories', :action => 'show_deeply_nested_category' 

Dann in Ihrem Controller

def show_deeply_nested_category 
    do_something = params[:slugs] # contains an array of the path segments 
end 

Beachten Sie jedoch, dass nested resource routing mehr als eine Ebene tiefer wird nicht empfohlen .

+0

Ich hatte die gleiche Frage, und das funktioniert perfekt. Ich würde argumentieren, dass Jamis 'Regel in diesem Fall nicht gilt, da die Ressource selbst als hierarchische Struktur dargestellt wird. (Und in diesem Fall müssen verschachtelte Ressourcen/Routen sowieso nicht verwendet werden). –

+0

Ich musste 'match' anstelle von 'map.connect' verwenden und es funktionierte perfekt –

+0

Was sollte als eine Alternative zum Verschachteln mehr als einer Tiefe getan werden? Die Dokumentation sagt nicht. – 0112

0

Es ist nicht einfach (lese: Ich weiß nicht, wie es geht) und es ist nicht ratsam. Stellen Sie sich vor, wenn Sie 10 Kategorien haben, möchten Sie nicht, dass die URL ist.

Vielleicht würde ein Höchstwert von 3 Ihnen die Leistung geben, die Sie wünschen, ohne die URL zu verschmutzen?

+0

Für meine Meinung Ebene sollte das Niveau durch das Modell, nicht durch die Routing-Regel begrenzt werden. – vooD

+0

@Ryan Bigg, wie würdest du es bevorzugen, eine URL für so etwas zu schreiben, vorausgesetzt, du hast n-Tiefe? Er versucht, eine Kategorie an einem bestimmten Ort im Baum zu zeigen (und es könnte andere haben). –

2

Ich bezweifle es, und es ist keine gute Idee. Rails Route Mapping-Code ist komplex genug, ohne dynamisch versuchen zu müssen, & decodieren (möglicherweise) unendliche Route Strings.

1

Sie können Einschränkungen im Routing von Schienen verwenden. Bsp .:

Klasse teilt Ihren Pfad mit "/" und prüft db für das letzte Element in db. Wenn nicht gefunden, wird die Route übersprungen. wenn jemand weiß, wie man es besser löst, würde mich freuen zu hören.

+0

heh, ich habe die beste Lösung gefunden. Erstellen Sie dann mit acts_as_nested_set eine neue Kategorie. Sie können den Pfad zum Stamm in einer Abfrage generieren. und dann einfach das Feld "Pfad" => "a/b/c" ankreuzen. – SpX