Разница между ресурсом и методами ресурсов - PullRequest
46 голосов
/ 08 февраля 2012

Какова логическая разница между 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). Почему?

Ответы [ 2 ]

97 голосов
/ 08 февраля 2012

На высоком уровне цель resource состоит в том, чтобы объявить, что когда-либо будет существовать только один из этих ресурсов.Например:

resource :profile, :only => [:edit, :update]

Как пользователь, я должен иметь возможность только обновлять свой профиль.Я никогда не смогу редактировать профили других пользователей, поэтому нет необходимости в схеме URL, такой как /users/1/profile/edit.Вместо этого я использую /profile/edit, и контроллер знает, что нужно использовать идентификатор текущего пользователя, а не идентификатор, переданный в URL (поскольку его нет).

Вот почему вы не получаете indexдействие с resource: есть только один ресурс, поэтому нет смысла «перечислять» их.

43 голосов
/ 08 февраля 2012

На самом деле вы правы, 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 или что-то еще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...