Подтвердить что ты не робот

Что означает член и маршрут сбора?

Чтение: http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

Что означает добавить "маршрут участника"?

или добавить маршрут к коллекции?

Что такое член и коллекция, когда вы говорите о маршрутах?

4b9b3361

Ответ 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 действий.

Ответ 2

Встроенные маршруты членов 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. Это упростит чтение кода, а другие кодеры будут легче понимать и поддерживать ваш код.