Ответ 1
Оба способа добавить дополнительные действия к ресурсному маршруту в Rails.
- Маршруту участника требуется идентификатор, потому что он действует на член.
- Тракт сбора не требует идентификатора, поскольку он действует на коллекцию объектов.
Мне нравится думать о них с точки зрения URL RESTful. Рассмотрим основы для ресурса/модели Foo
GET /foo # FooController#index
GET /foo/:id # FooController#show
GET /foo/new # FooController#new
POST /foo # FooController#create
GET /foo/:id/edit # FooController#edit
PUT /foo/:id # FooController#update
DELETE /foo/:id # FooController#destroy
Обратите внимание, как:
- В некоторых маршрутах есть: id placeholders для Foo.id, поэтому обратитесь к определенному Foo
- В некоторых маршрутах нет: id и, следовательно, ссылаются на все Foos (и/или нет конкретного foo, как в #new и #create)
- Некоторые маршруты (index/create, show/update/destroy) имеют один и тот же URL-адрес и используют методы HTTP для различения между ними.
- Некоторые маршруты (редактировать/показывать) в основном одинаковы (метод и префикс URL), за исключением другого суффикса (включая "без суффикса" ) в конце.
Пути участников и маршруты сбора данных позволяют добавлять дополнительные маршруты/действия, используя те же методы, что и я, перечисленные выше.
Маршрут участника добавляет настраиваемое действие к конкретному экземпляру с использованием суффикса URL и метода HTTP, который вы предоставляете. Итак, если у вас было объявление маршрута участника :member => { :bar => :get }
. вы получите дополнительный маршрут:
GET /foo/:id/bar # FooController#bar
Обратите внимание, как он перегружает GET /foo/:id
так же, как и `edit '. Так вы можете реализовать действие "удалить", которое предоставляет интерфейс для действия "destroy".
Аналогично, маршрут сбора добавляет перегрузку в коллекцию и/или неспецифический экземпляр (вам решать, что именно он подразумевает). Итак, если вы объявили :collection => { :baz => :get }
, вы получите дополнительный маршрут:
GET /foo/baz # FooController#baz
... очень точно так же, как new
.
Вы также можете настроить HTTP-метод.
Например, у меня недавно был проект, где мне понадобилось действие "ответить" на Comment
. Это в основном та же идея, что и Comment#create
(которая использует POST), за исключением того, что она относится к определенному родительскому Comment
. Итак, я создал маршрут участника: :member => { :reply => :post }
. Это дало мне:
POST /comment/:id/reply # CommentController#reply
Это сохраняет маршруты спокойными, все еще расширяя основные 7 действий.