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)。どうして?
実際、あなたが正しいです。インデックスアクションを明示的に要求しない限り、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
そして、論理的な違いは、あなたが論理的にあなたのアプリで複数のリソースを持つことができないことを宣言することです。
高レベルでは、resource
の目的は、これらのリソースの1つのみが存在することを宣言することです。例えば:
resource :profile, :only => [:edit, :update]
ユーザーとしては、自分のプロファイルのみを更新できます。他のユーザーのプロファイルを編集できないようにする必要があるため、/users/1/profile/edit
のようなURLスキームは必要ありません。代わりに、/profile/edit
を使用します。コントローラーは、URLで渡されたIDではなく、現在のユーザーのIDを使用することを認識しています(何もないため)。
index
でresource
アクションを取得できないのはそのためです。リソースは1つしかないため、それらを「一覧表示」する意味はありません。