diferencia entre ruta de recolección y ruta de miembro en ruby ​​on rails?

278

¿Cuál es la diferencia entre las rutas de recolección y las rutas de miembros en Rails?

Por ejemplo,

resources :photos do
  member do
    get :preview
  end
end

versus

resources :photos do
  collection do
    get :search
  end
end

No entiendo.

never_had_a_name
fuente

Respuestas:

407

Una ruta de miembro requerirá una identificación, porque actúa sobre un miembro . Una ruta de colección no lo hace porque actúa sobre una colección de objetos. La vista previa es un ejemplo de una ruta miembro, porque actúa (y muestra) un solo objeto. La búsqueda es un ejemplo de una ruta de colección, porque actúa (y muestra) una colección de objetos.

Theo
fuente
¿Qué pasa con la acción de crear? Digamos que quería hacer una alternativa para 'crear': ¿contaría como miembro?
digitalWestie
1
Sí, crear es una acción de miembro.
Theo
1
Pero, ¿qué hay de agregar un "get" sin ningún bloque? ¿Es miembro o ruta de recolección? Mi prueba mostró su colección pero con un nombre de variable de identificación diferente.
lzap
66
¿Está seguro de crear ser una acción miembro? No hay identificación para pasar.
George Shaw
66
@YoniGeek. Incorrecto. Ver guías.rubyonrails.org / routing.html , 2.7 Recursos anidados. Crear siempre es una acción de colección a medida que agrega a la colección. Tenga en cuenta que la ruta de creación nombrada siempre es plural. En su ejemplo, está agregando un nuevo voto a la colección de votos que pertenecen a un miembro de las publicaciones. La identificación se refiere a la publicación del miembro, no a la colección de votos que se está creando. La ruta nombrada sería posts_votes_url, por ejemplo.
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
fuente
39
publicación más valiosa!
aldo.roman.nurena
1
Debería usar en search_photos_pathlugar de search_photos_urlpara que las personas no piensen _pathy _urlsean una diferencia entre los dos.
Joshua Pinter
31

La respuesta de Theo es correcta. Por el bien de la documentación, me gustaría señalar también que los dos generarán diferentes ayudantes de ruta.

member {get 'preview'} Generará:

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

collection {get 'search'} Generará:

search_photos_path # /photos/search

Tenga en cuenta la pluralidad!

tybro0103
fuente
14

1) : colección - Agregue rutas con nombre para otras acciones que operan en la colección. Toma un hash de #{action} => #{method}, donde método es :get/:post/:put/:delete, una matriz de cualquiera de los anteriores, o: cualquiera si el método no importa. Estas rutas se asignan a una URL como / users / customers_list , con una ruta de customers_list_users_url .

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

2) :member- Igual que :collection, pero para acciones que operan en un miembro específico.

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

se trató como /users/1;inactive=> [:action => 'inactive', :id => 1]

Beena Shetty
fuente
buen ejemplo Sin embargo, la explicación en la parte superior podría haber sido mejor.
hitesh israni