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

225

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

Например,

resources :photos do
  member do
    get :preview
  end
end

против

resources :photos do
  collection do
    get :search
  end
end

Я не понимаю.

Теги:

4 ответа

321
Лучший ответ

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

  • 0
    А как насчет создания действия? Скажем, я хотел сделать альтернативу «создать» - будет ли он считаться членом?
  • 1
    Да, создание является членом действия.
Показать ещё 6 комментариев
157
                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)
  • 32
    самый ценный пост!
  • 1
    Следует использовать search_photos_path вместо search_photos_url чтобы люди не думали, что _path и _url - это разница между ними.
Показать ещё 1 комментарий
26

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

member {get 'preview'} будет генерировать:

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

collection {get 'search'} будет генерировать:

search_photos_path # /photos/search

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

9

1) : коллекция. Добавьте именованные маршруты для других действий, которые работают с коллекцией. Принимает хэш #{action} => #{method}, где метод :get/:post/:put/:delete, массив любого из предыдущего, или: любой, если метод не имеет значения. Эти маршруты сопоставляются с URL, например /users/customers_list, с маршрутом clients_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]

  • 0
    хороший пример объяснение сверху могло бы быть лучше, хотя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню