różnica między trasą odbioru a trasą członka w ruby ​​na szynach?

278

Jaka jest różnica między trasami zbierania a trasami członków w Railsach?

Na przykład,

resources :photos do
  member do
    get :preview
  end
end

przeciw

resources :photos do
  collection do
    get :search
  end
end

Nie rozumiem.

never_had_a_name
źródło

Odpowiedzi:

407

Trasa członka będzie wymagać identyfikatora, ponieważ działa na członka . Trasa kolekcji nie działa, ponieważ działa na kolekcję obiektów. Podgląd jest przykładem trasy członka, ponieważ działa na (i wyświetla) pojedynczy obiekt. Wyszukiwanie jest przykładem trasy kolekcji, ponieważ działa na kolekcję obiektów (i wyświetla ją).

Theo
źródło
Co z działaniem tworzenia? Powiedzmy, że chciałem stworzyć alternatywę dla „tworzenia” - czy liczy się to jako członek?
digitalWestie
1
Tak, tworzenie jest działaniem członkowskim.
Theo
1
Ale co z dodaniem „get” bez żadnego bloku? Czy jest to członek lub trasa odbioru? Mój test pokazał swoją kolekcję, ale z inną nazwą zmiennej id.
lzap
6
Czy na pewno chcesz zostać członkiem? Nie ma identyfikatora do przekazania.
George Shaw
6
@YoniGeek. Niepoprawne. Zobacz guide.rubyonrails.org/routing.html , 2.7 Zagnieżdżone zasoby. Tworzenie jest zawsze działaniem kolekcji podczas dodawania do kolekcji. Zauważ, że nazwana ścieżka tworzenia jest zawsze w liczbie mnogiej. W swoim przykładzie dodajesz nowy głos do zbioru głosów należących do członka postów. Identyfikator odnosi się do posta członka, a nie do tworzonej kolekcji głosów. Nazwaną ścieżką byłoby na przykład posts_votes_url.
George Shaw
217
                URL                 Helper                      Description
----------------------------------------------------------------------------------------------------------------------------------
member          /photos/1/preview   preview_photo_path(photo)   Acts on a specific resource so required id (preview specific photo)
collection      /photos/search      search_photos_path          Acts on collection of resources(display all photos)
Amit Patel
źródło
39
najcenniejszy post!
aldo.roman.nurena
1
Powinien używać search_photos_pathzamiast, search_photos_urlaby ludzie nie myśleli _pathi _urlsą różnicą między nimi.
Joshua Pinter
31

Odpowiedź Theo jest poprawna. Ze względu na dokumentację chciałbym również zauważyć, że te dwa generują różne pomocniki ścieżki.

member {get 'preview'} wygeneruje:

preview_photo_path(@photo) # /photos/1/preview

collection {get 'search'} wygeneruje:

search_photos_path # /photos/search

Zwróć uwagę na wiele!

tybro0103
źródło
14

1) : kolekcja - dodaj nazwane trasy dla innych działań, które działają na kolekcji. Pobiera skrót #{action} => #{method}, gdzie metoda jest :get/:post/:put/:delete, tablicy dowolnej z poprzednich lub: dowolna, jeśli metoda nie ma znaczenia. Trasy te są mapowane na adres URL taki jak / users / users_list , z trasą customer_list_users_url .

map.resources: users,: collection => {: clients_list =>: get}

2) :member- To samo co :collection, ale dla akcji, które działają na określonym elemencie.

map.resources: users,: member => {: inactive =>: post}

traktowane jak /users/1;inactive=> [:action => 'inactive', :id => 1]

Beena Shetty
źródło
niezły przykład. wyjaśnienie u góry mogłoby być jednak lepsze.
hitesh israni