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

Разница между ресурсами и ресурсами

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

4b9b3361

Ответ 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?