merbのrenderの動作

コードは、 merb-core/lib/merb-core/controller/mixins/responder.rb

/widgets.htmlにアクセスがあった場合

  • requestからformat決定
  • index.html.erb探して、あったらそのテンプレート使ってレスポンス返す

/widgets.xmlにアクセスがあった場合

  • requestからformat決定
  • index.xmlのテンプレート探してテンプレートがなかったら、

@widgetsのto_xmlメソッドをcall

/widgetsの場合

  • fmtがないのでHTTP Accept headerをみる
    • _perform_content_negotiationメソッドで
  • それが*/*だったらリスト中の最初のフォーマットを使用 :htmlがデフォルト。
  • 利用可能なフォーマットがなければ406を返す

fmt決定の仕組みが素敵ですね。@widgetsのto_メソッド呼ぶあたりもとても綺麗。これはControllerが綺麗になっていいなぁ。フォーマットが変わろうがControllerのロジックを何もかえなくていいというのが素晴らしい。

Mangoもto_xxxを呼ぶという点では似てるところがありますね