僕にとってすごいなだと思っているソースコードをピックアップした。

その1
アクションを実行前にリクエストを検証する。


class EntriesController < ApplicationController
 veriy :session => "user_id" , :method=>:post ,
    :redirect_to => { :action=>"index" },
    :only => [:create,:update,:delete]

  (略)

end

この検証コードをIF文で書くとどれくらいのながくなるか.....



その2

httpのメソッドを検証する。


class EntriesController < ApplicationController
 before_filter do |controller|
  referer = controller.request.referer.env["HTTP-REFERER"]
  redirect_to login_url unless /examp.com/ === referer
 end

  (略)

end


その3
リクエストの種類によってレスポンスのフォーマットを変更する。


class EntriesController < ApplicationController

def list
 @entries = Entry.find(:all)

  
(略)


 respond_to do |format|
  format.html
  format.js
  format.xml{ render :xml=>@entries.to_xml }
 end

end

実は僕もこの辺でどいう仕組みで処理されるか曖昧であった。なので、
ちょっと纏めってみた。


このformat.htmlメソッドのようにブロックを渡さずに実行した場合には以下のデフォルトのブロックが実行される。

メソッドデフォルトブロック
html { render :action => action_name }
js { render :action => "#{action_name}.rjs" }
xml { render :action => "#action_name.xml.builder" }



独自のフォーマットを追加したい場合には、Mime::Type.registerメソッドを使う。


Mime::Type.register "image/jpeg" , :jpg
Mime::Type.register "image/jpng" , :png
上記のように定義した場合、次のようにrespond_toメソッドでjpgとpng向けのフォーマット指定ができるようになる。


def   icon
  (略)
  respond_to do |format|
   format.jpg{ send_data(image.tojpg , :dispotision=>"inline"               , :type=>"image/jpeg") }
   format.jpg{ send_data(image.topng , :dispotision=>"inline"               , :type=>"image/png") }
}
end

以上のようにRailsならではのソースコードの書き方だと思う。


Railsレシピブック 183の技

Railsレシピブック 183の技