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について勉強