Resourcesのオプション

といっても全部ではなく代表的なのを抜粋で。

前にも少し書いたけど、resourcesを定義しただけの状態だと、index、new、edit、show、create、update、destroy以外のアクションが使えないので、アクションを追加するときは、:collection、:member、:newのいずれかを使用します。

:collection

デフォルトのアクションで言うところの、indexのような個別のidを指定しないタイプのアクションを追加する。

・config/routes.rb

  map.resources :products, :collection => {:search => :get}

アクションは{アクション => メソッド}というハッシュで指定します。これによって以下のルーティングとヘルパーが追加されます。メッソドには :get、:post、:put、:deleteを個別で指定する他に:anyで全てのメッソドに対応したアクションを定義する事できます。基本的にはメソッドを指定した方がいい気がしますが。

Named Route Method URL 対応するコントローラとアクション
search_products GET /products/search {:controller=>"products", :action=>"search"}
Named Route Helpers
search_products search_products_url, hash_for_search_products_url, search_products_path, hash_for_search_products_path


因みにresourcesにオプションを追加せずに、コントローラへアクションを追加して、/products/searchへアクセスするとこんなエラーになります。

ActiveRecord::RecordNotFound in ProductsController#show 
Couldn't find Product with ID=search

showにsearchというIDを渡してしまっています。つまり/products/:idというルーティングにマッチしてしまう訳です。

:member

edit、update、showのような個別のidを指定するタイプのアクションを追加します。

例)

  map.resources :products, :member => {:toggle => :put}
Named Route Method URL 対応するコントローラとアクション
toggle_product PUT /products/:id/toggle {:controller=>"products", :action=>"toggle"}
Named Route Helpers
toggle_product toggle_product_url, hash_for_toggle_product_url, toggle_product_path, hash_for_toggle_product_path

:new

基本的にはcollectionと同じですが、newのように新しいリソースに対するアクションを追加する際に使用するようです。が、new以外の使い方がイマイチ思いつきません。ので、利用例は割愛します。


次は、NamedRouteやURLを操作するオプションです。

:as

NamedRouteはそのままに、URLをコントローラとは別の名前にする事が出来ます。

例)

  map.resources :products, :as => 'project'
Named Route Method URL 対応するコントローラとアクション
products GET /project {:controller=>"products", :action=>"index"}

:path_prefix

URLに任意のprefixを追加します。NamedRouteはそのままです。

例)

  map.resources :products, :path_prefix => '/admin'
Named Route Method URL 対応するコントローラとアクション
products GET /admin/products {:controller=>"products", :action=>"index"}

:name_prefix

NamedRouteに任意のprefixを追加します。URLはそのままです。

例)

  map.resources :products, :name_prefix => 'admin_'
Named Route Method URL 対応するコントローラとアクション
admin_products GET /products {:controller=>"products", :action=>"index"}

:path_prefixと:name_prefixを両方使って親子関係になったリソースを設定できます。

例)

  map.resources :products
  map.resources :parts, :path_prefix => 'products/:product_id', :name_prefix => 'product_'
Named Route Method URL 対応するコントローラとアクション
product_parts GET /products/:product_id/parts {:controller=>"parts", :action=>"index"}

でもこれって

リソースをネストさせても同じ事なんです。

  map.resources :products do |product|
    product.resources :parts
  end
Named Route Method URL 対応するコントローラとアクション
product_parts GET /products/:product_id/parts {:controller=>"parts", :action=>"index"}

こっちの方が何だか解り易い感じがします。

または、親子関係をActiveRecordのように:has_one、:has_manyで設定する事も出来ます。

:has_oneはresource、:has_manyはresourcesでネストした場合と同じです。
ただしこの場合、子要素に対してオプションの指定が出来ないので、オプション指定が必要な場合は、ネスト方式で記述する必要があります。

:has_manyの例)

  map.resources :products, :has_many => :parts
Named Route Method URL 対応するコントローラとアクション
product_parts GET /products/:product_id/parts {:controller=>"parts", :action=>"index"}
has_many => [
parts, :group] のように配列で複数まとめて指定する事もできます。

 

その他のオプション

ここで紹介した以外にもいくつかのオプションがあるので、詳細はAPIドキュメントを参照してください。
404 Not Found