これまでの流れ
- Method#to_source を作るには Ruby を改造するしかない
- それは敷居が高すぎる
- MIME定義部分は block で妥協しよう
1 def show 2 @user = User.find(params[:id]) 3 end 4 5 show.xml { 6 render :text => @user.to_xml 7 }
def と block の併用は、respond_to
結論
そうだ!アクション定義も block にしよう!
1 show { 2 @user = User.find(params[:id]) 3 } 4 5 show.xml { 6 render :text => @user.to_xml 7 }
SexyAction s plugin
http://git
動作要件
- Rails2.x
例
Rails2.x の scaffold が生成する不細工なコード
1 class UsersController < Applicatio nControlle r 2 def index 3 @users = User.find(:all) 4 5 respond_to do |format| 6 format.html # index.html .erb 7 format.xml { render :xml => @users } 8 end 9 end 10 11 def show 12 @user = User.find(params[:id]) 13 14 respond_to do |format| 15 format.html # show.html. erb 16 format.xml { render :xml => @user } 17 end 18 end 19 20 ...
俺達のセクシーなコード
1 class UsersController < Applicatio nControlle r 2 include SexyAction s 3 4 index { @users = User.find(:all) } 5 index.html # index.html .erb 6 index.xml { render :xml => @users } 7 8 show { @user = User.find(params[:id]) } 9 show.html # show.html. erb 10 show.xml { render :xml => @user } 11 12 ...
動作
- 各アクションの定義は method_mis
sing 経由で得られるproxyオブジェクトが行う - 表記の制約により、定義時のコンテキストはコントローラクラスになる
- 従ってinstanceだけでなくclassに対してもアクション名と同名のメソッドが定義される
まとめ
- 可読性が上がった (定義内容が1行の場合の美しさは半端ない)
- 再利用性が上がった (あるMIMEの動作だけ再定義することができる)
致命的な問題
- new アクションが定義できない事に気付いた><
おおー。Coolだ。