Чтение: http://guides.rubyonrails.org/routing.html#adding-more-restful-actions
Что означает добавить "маршрут участника"?
или добавить маршрут к коллекции?
Что такое член и коллекция, когда вы говорите о маршрутах?
Чтение: http://guides.rubyonrails.org/routing.html#adding-more-restful-actions
Что означает добавить "маршрут участника"?
или добавить маршрут к коллекции?
Что такое член и коллекция, когда вы говорите о маршрутах?
Оба способа добавить дополнительные действия к ресурсному маршруту в 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
Обратите внимание, как:
Пути участников и маршруты сбора данных позволяют добавлять дополнительные маршруты/действия, используя те же методы, что и я, перечисленные выше.
Маршрут участника добавляет настраиваемое действие к конкретному экземпляру с использованием суффикса 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 действий.
Встроенные маршруты членов show
, edit
, update
и destroy
, поскольку они обрабатывают отдельную запись. index
будет маршрутом сбора, поскольку он возвращает коллекцию записей.
Так что это действительно зависит, если вы хотите что-то сделать с помощью одной записи (члена) или нескольких записей (коллекции).
Помощники URL отражают сингулярный (член) и множественный (сбор). Например:
Это участник:
person_path(@person)
Это коллекция:
people_path()
Если вы определяете собственный путь к коллекции, это может выглядеть так: routes.rb
:
resources :people do
member do
put :make_manager
end
collection do
get :show_managers
end
end
Сделать кого-то ясли:
make_manager_person_path(@person)
Перечислить всех менеджеров:
show_managers_people_path()
Я не думаю, что маршрут "заботится", если вы используете его по-другому, но это путь Rails. Это упростит чтение кода, а другие кодеры будут легче понимать и поддерживать ваш код.