web-dev-qa-db-ja.com

リソースとリソースメソッドの違い

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

メソッドresourceindexのルートを作成せず、ヘルパーが異なる場合があります(new_orderとnew_orders)。どうして?

46
alexkv

実際、あなたが正しいです。インデックスアクションを明示的に要求しない限り、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

そして、論理的な違いは、あなたが論理的にあなたのアプリで複数のリソースを持つことができないことを宣言することです。

43
alony

高レベルでは、resourceの目的は、これらのリソースの1つのみが存在することを宣言することです。例えば:

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

ユーザーとしては、自分のプロファイルのみを更新できます。他のユーザーのプロファイルを編集できないようにする必要があるため、/users/1/profile/editのようなURLスキームは必要ありません。代わりに、/profile/editを使用します。コントローラーは、URLで渡されたIDではなく、現在のユーザーのIDを使用することを認識しています(何もないため)。

indexresourceアクションを取得できないのはそのためです。リソースは1つしかないため、それらを「一覧表示」する意味はありません。

97
Brandan