route.rbでscaffoldして作ったアクションを整理する

他にもroute.rbでの試行錯誤メモ

アクションの整理

・必要なアクションだけを使えるようにする

map.resources :hoges, :only => ['create','show'] #create,showだけ使える

・不要なアクションを指定し、それ以外を使えるようにする

map.resources :hoges, :except => ['create','show'] #create,show以外はすべて使える

新しいアクションを定義する

・idに依存しない

map.resources :hoges, :collection => [:hoge] #URLは"hoges/hoge"

・idに依存する

map.resources :hoges, :member => [:hoge] #URLは"hoges/:id/hoge"

・HTTPメソッドを指定して、アクションを定義

map.resources :hoges, :collection => {:hoge => :post} #:get,:post,:put,:delete,:anyが指定可

失敗例

実際にやらかした失敗を列挙
1.アクション定義でmap.resourceを何度も記述
例えばhoge1,hoge2,hoge3をアクションとして定義する時、以下のように記述していた。

map.resources :hoges, :collection => [:hoge1]
map.resources :hoges, :collection => [:hoge2]
map.resources :hoges, :member => [:hoge3]

このとき

$ rake routes

で確認してみると、hoge1,hoge2,hoge3に関してはルートが1回ずつ定義されているが、その他のindex,showなどのscaffold時に作成したアクションは3回ずつ定義されていて大変見辛い。機能的には問題ないかもしれないが。

よって以下のように変更

map.resources :hoges, :collection => [:hoge1, :hoge2], :member => {:hoge3 => :post}

2.:only, :exceptを使うときに、1と同じミス
先程と同じように何度もmap.resourceを用いたせいで:only,:exceptが機能しなかった。

map.resources :hoges, :collection => [:hoge1]
map.resources :hoges, :only => [:hoge1, :index]

本来であればhoge1とindexしか呼び出せないはずだが、これはすべて呼び出せてしまう。なぜなら:onlyのときは確かにhoge1とindexにだけルートを作っているが、:collectionの時にすべてのアクションに関してルートを1度作ってしまっているからである。

よって以下のように変更

map.resources :hoges, :collection => [:hoge1], :only => [:hoge1, :index]

書き方がわかってなかっただけだった。
次回同じくroute.rbのmap.connectについて勉強



参考サイト:2.0のmap.resourcesのオプション設定いろいろ - ザリガニが見ていた...。