読者です 読者をやめる 読者になる 読者になる

merbの特徴を和訳してみました(誤訳あり)

Merbはすごい若いフレームワークですが、多くの特徴を持っています。

Plugins
MerbはRubyForgeから配布されています。
Pluginsのメリットはバージョン管理と依存関係を理解できることです。
また、Pluginsはシステムのレポジトリに格納することもアプリケーションに直接入れることも可能です。
Merbは/gemsできられたレポジトリの内容を自由に追加することができます。

Merb PluginsはActiveRecord,DataMapper,Sequel、さらにはSQL Sessionやモデルgenerate,database.ymlなどをサポートしています。
gitレポジトリに含まれているMerbプラグインを利用することで、Railsライクなヘルパーを利用することができます。

Controllers
Merbのコントローラは主に2つのコンポーネントからできています。
その一つが、AbstractControllerです。これはtemplateやlayout、インスタンス変数やbefore/afterフィルターを
操作します。
2つ目はMerb::Controllerです。これはrequest/responseを操作します。
別々に切り分けしておくことで、AbstractControllerやMailer,Partsから機能を相続することができます。

Controllerはcontent-typeのサポートに優れています。
開発者はControllerや個々のaction単位でMime-typeを指定することができます。
一度情報が提供されると、Controllerは自動的に多くの方法から最適なコンテンツ表示方法でレンダリングを行います。
例えば、foo.html.erbというtemplateが存在していた場合、自動的にcontent-typeはtext/htmlだと認識されます。

また、@objectなどがレンダリングされる場合、@object.to_mine_typeが呼び出されます。(例えば、@object.to_xml)
Mine-typeの選択はファイルの規約(foo.htmlならtext/html)と、Access Headerから参照する2つの方法があります。
もし最適な選択ができない場合、renderはfall-backしてレンダリングを再度行います。


Mailers
MerbのMail機能はAbstractControllerに含まれています。
なのでdefaultで利用することができます。しかしレンダリングする際は、render_mailという呼び方をします。
Ex)render_mail :html => :foo, :text => :bar
たくさんのオプションにもサポートされています。
全体のレイアウトと#attachメソッドを指定することでメールに関してかなり些細なところまで指定することができます。

Mailersは自身でrootディレクトリを持っており、controllerクラスをうまく内包しています。
(viewディレクトリがlayoutを内包しているように)
controllerにて個々のlayoutを指定できるので、柔軟なlayoutを作成してそれをMailersの中に簡単に組み込むことができます。

Mailersは通常send_mail classから:action,optionsとともにcontrollerから呼ばれます。
optionsにはfrom,to,subject,ccなどが含まれます。

Parts
MailersのようにPartsはController/Viewで利用されているAbstractControllerを利用して柔軟なものを作成できます。
PartsはMailerのようにディレクトリ構成をもっており、ロジックから抜き出すことが可能です。

例えば、アプリ全体を表すタグクラウドが必要になったとします。
あなたはタグクラウド機能を作成して、templateを表示するのに必要なactionをcontroller logicにセットアップします。
ControllerやMailerのように、Partsもlayoutやtemplate,before/afterフィルターを設定できます。
PartsはTagCloud => :showのように呼ばれます。
Partsはpartialsの部分としてロジックの外に分割することができます。
そうするとあなたは大規模なcontrollerではなく個々に分割したcomponentを実現することができます。

Exceptions
Merbは例外に関しても機能を持っています。
あなたのアプリケーションでエラーが起きたとき、例外を投げるのではなく、Merbは例外の種類を確認して、controllerやview
に処理を渡すことができます。
例えば、not_foundエラーが起こった際、Exception#not_foundアクションが呼ばれるので、あなたはその処理を自分で設定することが
できます。この方法でレスポンスを返してもブラウザにはエラーコードを伝えます。
すべてのHTTPエラーコードはMerb内でクラスとして定義されています。
なので、もしNot_accessbleエラーが起きた場合、MerbはException#not_accessbleアクションが呼ばれ、
さらにクライアントには406コードを返します。

Tests and Specs
Merbはテストフレームワークです。Test::Unit,rspec,test/rspecどのケースでも利用できます。
mockオブジェクトをサポートしているので、小さい単位でテストが可能です。
もしやりたいのなら、controllerもrequestがなくてもテストすることが可能です。

Generators
Merbはアプリ起動までを早くするためのgeneratorを持っています。
まずMerb application generatorはmerb-gen app "application_name"を指定してアプリのひな形を作成します。
またpluginもmerb-gen plugin merb_plugin_nameを指定してプラグインのひな形を作成できます。
これらをrakeタスクを用いることで簡単にパッケージ化できます。