diferença entre rota de coleta e rota de membro em ruby ​​on trilhos?

278

Qual é a diferença entre rotas de coleta e rotas de membros no Rails?

Por exemplo,

resources :photos do
  member do
    get :preview
  end
end

versus

resources :photos do
  collection do
    get :search
  end
end

Eu não entendo

never_had_a_name
fonte

Respostas:

407

Uma rota de membro exigirá um ID, porque atua em um membro . Uma rota de coleção não funciona porque age em uma coleção de objetos. A visualização é um exemplo de uma rota de membro, porque atua em (e exibe) um único objeto. A pesquisa é um exemplo de uma rota de coleção, porque atua (e exibe) uma coleção de objetos.

Theo
fonte
E a ação de criação? Digamos que eu quisesse fazer uma alternativa para 'criar' - isso contaria como membro?
precisa
1
Sim, criar é uma ação de membro.
Theo
1
Mas e quanto a adicionar um "get" sem nenhum bloco? É membro ou rota de coleta? Meu teste mostrou sua coleção, mas com um nome de variável de ID diferente.
Lzap 19/04
6
Você tem certeza de que criar ser uma ação de membro. Não há ID para passar.
George Shaw
6
@YoniGeek. Incorreto. Consulte guias.rubyonrails.org/routing.html , 2.7 Recursos aninhados. Criar é sempre uma ação de coleção à medida que você está adicionando à coleção. Observe que o caminho de criação nomeado é sempre plural. No seu exemplo, você está adicionando um novo voto à coleção de votos que pertencem a um membro das postagens. O id refere-se à postagem do membro, não à coleção de votos que está sendo criada. O caminho nomeado seria posts_votes_url, por exemplo.
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
fonte
39
post mais valioso!
Aldo.roman.nurena
1
Deve usar em search_photos_pathvez de search_photos_urlpara que as pessoas não pensem _pathe _urlsão uma diferença entre os dois.
Joshua Pinter
31

A resposta de Theo está correta. Para fins de documentação, eu também gostaria de observar que os dois irão gerar ajudantes de caminho diferentes.

member {get 'preview'} irá gerar:

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

collection {get 'search'} irá gerar:

search_photos_path # /photos/search

Observe a pluralidade!

tybro0103
fonte
14

1) : coleção - Adicione rotas nomeadas para outras ações que operam na coleção. Obtém um hash de #{action} => #{method}, onde método é :get/:post/:put/:delete, uma matriz de qualquer um dos anteriores, ou: any, se o método não importa. Essas rotas são mapeadas para um URL como / users / customers_list , com uma rota de customers_list_users_url .

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

2) :member- O mesmo que :collection, mas para ações que operam em um membro específico.

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

tratou como /users/1;inactive=> [:action => 'inactive', :id => 1]

Beena Shetty
fonte
bom exemplo. explicação no topo poderia ter sido melhor embora.
Hitesh israni