2010-04-01 81 views
7

Moja klasa model:Zagnieżdżony routingu w 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 

Czy to możliwe, aby mieć taką rekurencyjną trasy tak: /root_category_slug/child_category_slug/child_of_a_child_category_slug ... i tak jeden

Dziękuję za wszelką pomoc:)

+1

Świetne pytanie. –

Odpowiedz

4

można zrobić z regularnych trasach i Route Globbing, więc na przykład

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

wówczas w kontrolerze

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

jednak pamiętać, że głęboko nested resource routing więcej niż jeden poziom nie jest zalecane .

+0

Miałem to samo pytanie i to działa idealnie. Uważam, że zasada Jamisa nie ma zastosowania w tym przypadku, ponieważ sam zasób jest reprezentowany jako struktura hierarchiczna. (W tym przypadku nie ma potrzeby korzystania z zagnieżdżonych zasobów/tras). –

+0

Musiałem użyć "dopasowania" zamiast "map.connect" i działało idealnie –

+0

Co należy zrobić jako alternatywę dla zagnieżdżenia więcej niż jednego głębokiego? Dokumentacja nie mówi. – 0112

0

To nie jest łatwe (czytaj: nie wiem jak to zrobić) i nie jest to zalecane. Wyobraź sobie, że masz 10 kategorii, ale nie chcesz, aby adres URL był /categorya/categoryb/categoryc/categoryd/categorye/categoryf/categoryg/categoryh/categoryi/categoryj.

Być może maksymalny poziom 3 da ci pożądaną moc, bez zanieczyszczania adresu URL?

+0

Dla mojego poziomu opinii poziom powinien być ograniczony przez model, a nie przez regułę routingu. – vooD

+0

@Ryan Bigg, jak wolisz napisać adres URL czegoś podobnego, zakładając, że masz n-głębokość? próbuje pokazać kategorię w określonym miejscu w drzewie (i może mieć inne). –

2

Wątpię w to i nie jest to dobry pomysł. Kod odwzorowania trasy Railsów jest wystarczająco złożony, bez konieczności dynamicznego próbowania kodowania (prawdopodobnie) nieskończonych ciągów tras.

1

Można użyć ograniczeń w routingu szyn. np .:

match '*id', :to => 'categories#show', :constraints => TaxonConstraint.new 

class TaxonConstraint 
    def matches?(request) 
    path = request.path.slice(1..(request.path.length-1) 
    path = path.split('/') 
    return false if path.length != path.uniq.length 
    return true if Category.check(path.last).first 
    false 
    end 
end 

klasa dzieli twoją ścieżkę przez "/" i sprawdza db dla ostatniego elementu w db. jeśli nie zostanie znaleziony, pomija trasę. jeśli ktoś wie, jak go lepiej rozwiązać, byłby zadowolony usłyszeć.

+0

heh, znalazłem najlepsze rozwiązanie. następnie utwórz nową kategorię za pomocą acts_as_nested_set, możesz wygenerować ścieżkę do katalogu głównego w 1 zapytaniu. a następnie po prostu zaznacz pole "path" => "a/b/c". – SpX