différence entre l'itinéraire de collecte et l'itinéraire des membres en rubis sur rails?

278

Quelle est la différence entre les itinéraires de collecte et les itinéraires membres dans Rails?

Par exemple,

resources :photos do
  member do
    get :preview
  end
end

contre

resources :photos do
  collection do
    get :search
  end
end

Je ne comprends pas.

Never_had_a_name
la source

Réponses:

407

Une route membre nécessitera un ID, car elle agit sur un membre . Un itinéraire de collecte ne fonctionne pas car il agit sur une collection d'objets. L'aperçu est un exemple de route d'un membre, car il agit sur (et affiche) un seul objet. La recherche est un exemple de route de collecte, car elle agit sur (et affiche) une collection d'objets.

Théo
la source
Qu'en est-il de l'action de création? Disons que je voulais faire une alternative à «créer» - cela compterait-il comme membre?
digitalWestie
1
Oui, créer est une action membre.
Theo
1
Mais qu'en est-il de l'ajout d'un "get" sans aucun bloc? S'agit-il d'un itinéraire de membre ou de collecte? Mon test a montré sa collection mais avec un nom de variable id différent.
lzap
6
Voulez-vous vraiment créer une action de membre? Il n'y a aucune pièce d'identité à passer.
George Shaw
6
@YoniGeek. Pas correcte. Voir guides.rubyonrails.org/routing.html , 2.7 Ressources imbriquées. Créer est toujours une action de collection lorsque vous ajoutez à la collection. Notez que le chemin de création nommé est toujours pluriel. Dans votre exemple, vous ajoutez un nouveau vote à la collection de votes appartenant à un membre de postes. L'ID fait référence à la publication du membre, pas à la collection de votes en cours de création. Le chemin nommé serait posts_votes_url, par exemple.
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
la source
39
poste le plus précieux!
aldo.roman.nurena
1
Devrait utiliser search_photos_pathau lieu de search_photos_urlpour que les gens ne pensent pas _pathet _urlfont la différence entre les deux.
Joshua Pinter
31

La réponse de Théo est correcte. Pour la documentation, je voudrais également noter que les deux généreront des assistants de chemin différents.

member {get 'preview'} générera:

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

collection {get 'search'} générera:

search_photos_path # /photos/search

Notez la pluralité!

tybro0103
la source
14

1) : collection - Ajoutez des routes nommées pour d'autres actions qui opèrent sur la collection. Prend un hachage de #{action} => #{method}, où méthode est :get/:post/:put/:delete, un tableau de l'un des précédents, ou: n'importe si la méthode n'a pas d'importance. Ces itinéraires sont mappés vers une URL telle que / users / customers_list , avec un itinéraire de customers_list_users_url .

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

2) :member- Identique à :collection, mais pour les actions qui opèrent sur un membre spécifique.

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

il a traité comme /users/1;inactive=> [:action => 'inactive', :id => 1]

Beena Shetty
la source
bel exemple. l'explication au sommet aurait pu être meilleure cependant.
hitesh israni