Разница между ресурсами и ресурсами
Какова логическая разница между методами resource
и resources
Вот несколько примеров:
resource :orders, :only => [:index, :create, :show]
> rake routes
orders POST /orders(.:format) orders#create
GET /orders(.:format) orders#show
resources :orders, :only => [:index, :create, :show]
> rake routes
orders GET /orders(.:format) orders#index
POST /orders(.:format) orders#create
order GET /orders/:id(.:format) orders#show
resource :orders
> rake routes
orders POST /orders(.:format) orders#create
new_orders GET /orders/new(.:format) orders#new
edit_orders GET /orders/edit(.:format) orders#edit
GET /orders(.:format) orders#show
PUT /orders(.:format) orders#update
DELETE /orders(.:format) orders#destroy
resources :orders
> rake routes
orders GET /orders(.:format) orders#index
POST /orders(.:format) orders#create
new_order GET /orders/new(.:format) orders#new
edit_order GET /orders/:id/edit(.:format) orders#edit
order GET /orders/:id(.:format) orders#show
PUT /orders/:id(.:format) orders#update
DELETE /orders/:id(.:format) orders#destroy
Похоже, что метод resource
не создает маршрут для index
, а помощники в некоторых случаях различаются (new_order и new_orders). Почему?
Ответы
Ответ 1
На самом деле вы правы, resource
не должен создавать действие индекса, если вы не запрашиваете действие индекса явно, следующим образом:
resource :orders, :only => [:index, :create, :show]
Помощники тоже должны отличаться, но не так сильно, как в вашем примере, поскольку соглашение заключается в использовании сингулярной формы с методом resource
, а множественное число с resources
resources :orders
=> rake routes
orders GET /orders(.:format) orders#index
POST /orders(.:format) orders#create
new_order GET /orders/new(.:format) orders#new
edit_order GET /orders/:id/edit(.:format) orders#edit
order GET /orders/:id(.:format) orders#show
PUT /orders/:id(.:format) orders#update
DELETE /orders/:id(.:format) orders#destroy
resource :order
=> rake routes
order POST /order(.:format) orders#create
new_order GET /order/new(.:format) orders#new
edit_order GET /order/:id/edit(.:format) orders#edit
GET /order/:id(.:format) orders#show
PUT /order/:id(.:format) orders#update
DELETE /order/:id(.:format) orders#destroy
И логическая разница заключается в том, что вы логически заявляете, что не можете иметь множественное число для ресурса в вашем приложении, например Admin или что-то еще
Ответ 2
На высоком уровне цель resource
состоит в том, чтобы объявить, что только один из этих ресурсов будет когда-либо существовать. Например:
resource :profile, :only => [:edit, :update]
Как пользователь, я должен только обновить свой собственный профиль. Мне никогда не удастся редактировать профили других пользователей, поэтому нет необходимости в схеме URL, например /users/1/profile/edit
. Вместо этого я использую /profile/edit
, и контроллер знает, что использовать текущий идентификатор пользователя, а не идентификатор, переданный в URL (поскольку его нет).
То почему вы не получаете действие index
с resource
: там только один ресурс, поэтому нет смысла их перечислять.
Ответ 3
Есть что-то неловкое в разнице,
забывая о ресурсах, мои сгенерированные помощники по маршруту будут как-то сбиты с толку
например. При вводе помощника для класса: тема, которая будет направлена на редактирование, и эта тема
edit_subject_path (subject) → выдает ошибку, которая говорит, что вы имели в виду edit_subjects_path?