В чем разница между маршрутами :new, :collection и :member?
-
13-09-2019 - |
Вопрос
Я прочитал документация, но я все еще не уверен, что все понимаю.
Особенно почему есть :new
параметр.Насколько я понимаю, его можно заменить на :collection
параметр.
Так в чем же разница между этими тремя типами маршрутов?
Решение
Разница заключается в сгенерированном URL-адресе.
Давайте угадаем три ресурса:
map.resources :users, :collection => { :rss => :get }
map.resources :users, :member => { :profile => :get }
map.resources :users, :new => { :draft => :get }
Первый маршрут создаст:
/users/rss
Между именем контроллера и именем действия ничего нет.Нам не нужен никакой другой параметр, чтобы получить RSS-канал списка пользователей.
Второй создаст действие «профиль» как член объекта.Итак, у нас будет:
/users/1/profile
«1» — это пользователь. to_param
.Нам нужен идентификатор пользователя для отображения профиля.
Третий создаст действие «Черновик» как член нового действия.Итак, у нас будет:
/users/new/draft
Действие «черновик» отображает черновик пользователя перед принятием его создания.
Вот в чем разница между :collection, :member и :new.Каждый из них прокладывает разные маршруты, каждый со своей целью.
Другие советы
:member
создает путь с шаблоном /:controller/:id/:your_method
:collection
создает путь с шаблоном /:controller/:your_method
:new
создает путь с шаблоном /:controller/:your_method/new
(обратите внимание, что последний элемент пути, т.е. new
постоянно)
New
отличается от Collection
преимущественно на идеологическом уровне.Вот как гуру REST видят создание «подресурса» REST внутри более крупного ресурса.
Объяснение Дэмьена в основном верно, за исключением раздела о :new.
Ознакомьтесь с руководством по маршрутизации Ruby on Rails на сайте http://guides.rubyonrails.org/routing.html Он объясняет маршрутизацию изнутри наружу, а затем обратно.Раздел 3.11.3 (Добавление новых маршрутов) описывает, что делает :new, и он сильно отличается от :member и :collection.
По сути, map.resources :photos, :new => { :upload => :post } создаст /photos/upload с использованием HTTP-глагола POST.