Разница между маршрутом сбора и маршрутом члена в ruby ​​на рельсах?


278

В чем разница между маршрутами сбора и маршрутами членов в Rails?

Например,

resources :photos do
  member do
    get :preview
  end
end

против

resources :photos do
  collection do
    get :search
  end
end

Я не понимаю

Ответы:


407

Для маршрута участника потребуется идентификатор, потому что он действует на участника . Маршрут коллекции не потому, что он действует на коллекцию объектов. Предварительный просмотр является примером маршрута участника, поскольку он действует (и отображает) один объект. Поиск является примером маршрута коллекции, поскольку он действует (и отображает) коллекцию объектов.


А как насчет создания действия? Скажем, я хотел сделать альтернативу «создать» - будет ли он считаться членом?
digitalWestie

1
Да, создание является членом действия.
Тео

1
Но как насчет добавления «получить» без какого-либо блока? Это маршрут участника или коллекции? Мой тест показал его коллекцию, но с другим именем переменной id.
lzap

6
Вы уверены, что создаете действие участника? Нет идентификатора для передачи.
Джордж Шоу

6
@YoniGeek. Не верно. См. Guides.rubyonrails.org/routing.html , 2.7 Вложенные ресурсы. Создание всегда является действием коллекции, когда вы добавляете в коллекцию. Обратите внимание, что именованный путь создания всегда во множественном числе. В вашем примере вы добавляете новый голос в коллекцию голосов, принадлежащих участнику сообщений. Идентификатор относится к записи участника, а не к коллекции создаваемых голосов. Например, именованный путь будет posts_votes_url.
Джордж Шоу

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
самый ценный пост!
aldo.roman.nurena

1
Следует использовать search_photos_pathвместо того, search_photos_urlчтобы люди не думали _pathи _urlразница между ними.
Джошуа Пинтер

31

Тео ответ правильный. Ради документации, я хотел бы также отметить, что эти два будут генерировать разные помощники пути.

member {get 'preview'} сгенерирует:

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

collection {get 'search'} сгенерирует:

search_photos_path # /photos/search

Обратите внимание на множественность!


14

1) : collection - добавить именованные маршруты для других действий, которые работают с коллекцией. Принимает хеш #{action} => #{method}, где метод является :get/:post/:put/:delete, массивом любого из предыдущих или: any, если метод не имеет значения. Эти маршруты отображаются на URL-адрес, такой как / users / Customers_list , с маршрутом customer_list_users_url .

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

2) :member- То же, что :collectionи для действий, которые действуют на конкретного участника.

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

это рассматривается как /users/1;inactive=> [:action => 'inactive', :id => 1]


хороший пример объяснение сверху могло бы быть лучше, хотя.
hitesh israni
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.