2008-10-02 19 views
11

Przesłanka: Zwykle podczas przygotowywania nowej aplikacji Ruby on Rails rysuję modele i relacje dotyczące nawigacji użytkownika. Zwykle uderzam w miejsce, w którym muszę zadać sobie pytanie, czy powinienem wyjść poza zwykłą "regułę" zagnieżdżania nie więcej niż 1 poziom głębokości. Czasem czuję potrzebę zagnieżdżenia, zamiast tworzyć inną ścieżkę obszaru nazw i duplikować pracę.
Oto przykład:
Aby zagnieździć się lub nie zagnieździć?

Modele: użytkownika, Firma, Lokalizacja
Użytkownik ma i należy do wielu firm (wiele do wielu)
Filmaster i należy do wielu lokalizacjach (wiele do wielu)
Spółka posiada i należy do wielu miejscach (wiele do wielu)

trasach:
1 poziom zagnieżdżenia
użytkowników /: user_id/Katalog firm/- lista wszystkich firm związanych z użytkownikiem
użytkowników /: user_id/lokalizacje/- lista wszystkich miejsc związanych z użytkownikiem
więcej niż 1 poziom zagnieżdżenia
użytkowników /: id_użytkownika/firmy /: company_id/locations/- lista wszystkich lokalizacji firmy użytkownika:

Moje pytanie brzmi, czy właściwe jest zagnieździć więcej niż 1 poziom w RoR? Tak lub nie? I dlaczego?

Odpowiedz

7

Mam tendencję do podążania za Jamis Buckiem advice i nigdy nie zagnieżdża się więcej niż jeden poziom głębokości.

Edit: Jeśli idziesz do gniazda więcej niż 1 poziom bym Sprawdź nowy shallow routes funkcję Edge

+0

Trasa płytka FTW. To prawie na pewno to, czego chcesz. LocationsController # index nie ma sensu jako/lokalizacji, ponieważ nigdy nie chciałbyś/all/the location.Pozwala jednak zachować wszystkie lokalizacje w/location/ niezależnie od typu, z którym jest skojarzony. – Otto

2
users/:user_id/companies/:company_id/locations/ 

Chociaż technicznie to jest w porządku, nie nazwany pomocnik trasa zatem

user_company_location_path(user_id, company_id, location_id) 

konieczność rundy 3 takich parametrów jest denerwująca. Wszystko irytujące to prawdopodobnie czerwona flaga.

+0

sprawdź smart_url w resource_controller: smart_url (@user, @ company, @location). Ale tak, gniazdowanie zbyt głębokie wydaje się błędne. – webmat

1

Mimo, że brzmi dobrze w teorii, Znalazłem gniazdowania więcej niż jeden poziom może zacząć się mylące - zwłaszcza jeśli mają taką samą nazwie kontrolera na różnych poziomach (co może być dość powszechne)

Np

user/x/blog/y/profile/z, and 
    user/x/profile/a 

będę często pracuję w innej przestrzeni nazw do tego, co myślę, że pracuję w. Jeśli tak podobne, ale różne rzeczy, to może być dość kłopotliwe =)

My bieżąca aplikacja, przeszedłem przez ostatni tydzień i usunąłem większość zagnieżdżone trasy. (Oczywiście, YMMV)