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