Unterschied zwischen Sammelroute und Mitgliedsroute in Rubin auf Schienen?


278

Was ist der Unterschied zwischen Sammelrouten und Mitgliedsrouten in Rails?

Zum Beispiel,

resources :photos do
  member do
    get :preview
  end
end

gegen

resources :photos do
  collection do
    get :search
  end
end

Ich verstehe nicht.

Antworten:


407

Für eine Mitgliederroute ist eine ID erforderlich, da sie auf ein Mitglied wirkt . Eine Sammelroute funktioniert nicht, weil sie auf eine Sammlung von Objekten wirkt. Die Vorschau ist ein Beispiel für eine Mitgliedsroute, da sie auf ein einzelnes Objekt wirkt (und es anzeigt). Die Suche ist ein Beispiel für eine Sammlungsroute, da sie auf eine Sammlung von Objekten wirkt (und diese anzeigt).


Was ist mit der Aktion "Erstellen"? Angenommen, ich wollte eine Alternative zu "Erstellen" erstellen - würde dies als Mitglied gelten?
digitalWestie

1
Ja, create ist eine Mitgliederaktion.
Theo

1
Aber was ist mit dem Hinzufügen eines "get" ohne Block? Ist es Mitglied oder Sammelweg? Mein Test zeigte seine Sammlung, jedoch mit einem anderen ID-Variablennamen.
lzap

6
Sind Sie sicher, dass create eine Mitgliedsaktion ist? Es ist kein Ausweis zu übergeben.
George Shaw

6
@ YoniGeek. Nicht richtig. Siehe guides.rubyonrails.org/routing.html , 2.7 Verschachtelte Ressourcen. Erstellen ist immer eine Sammlungsaktion, wenn Sie der Sammlung hinzufügen. Beachten Sie, dass der benannte Erstellungspfad immer Plural ist. In Ihrem Beispiel fügen Sie der Sammlung von Stimmen, die einem Mitglied von Posts gehören, eine neue Stimme hinzu. Die ID bezieht sich auf den Mitgliedsbeitrag und nicht auf die Sammlung der Stimmen, die erstellt werden. Der benannte Pfad lautet beispielsweise 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)

39
wertvollster Beitrag!
aldo.roman.nurena

1
Sollte search_photos_pathstattdessen verwenden, search_photos_urldamit die Leute nicht denken _pathund _urleinen Unterschied zwischen den beiden machen.
Joshua Pinter

31

Theos Antwort ist richtig. Aus Gründen der Dokumentation möchte ich auch darauf hinweisen, dass die beiden unterschiedliche Pfadhelfer generieren.

member {get 'preview'} wird erzeugen:

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

collection {get 'search'} wird erzeugen:

search_photos_path # /photos/search

Beachten Sie die Vielzahl!


14

1) : Sammlung - Fügen Sie benannte Routen für andere Aktionen hinzu, die für die Sammlung ausgeführt werden. Nimmt einen Hash von #{action} => #{method}, wobei die Methode :get/:post/:put/:deleteein Array eines der vorherigen ist, oder: any, wenn die Methode keine Rolle spielt. Diese Routen werden einer URL wie / users / customers_list mit einer Route von customers_list_users_url zugeordnet .

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

2) :member- Wie :collection, jedoch für Aktionen, die für ein bestimmtes Mitglied ausgeführt werden.

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

es behandelt als /users/1;inactive=> [:action => 'inactive', :id => 1]


schönes Beispiel. Die Erklärung oben hätte allerdings besser sein können.
Hitesh Israni
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.