というわけで早速フィードバック
以前試作してみたCompositeViewですが、Wikiの方でもコメントをいただきましたが、Actionフィルタの機能として持たせるのはやっぱり筋が違った感じがしますね。あの時なぜActionフィルタに入れたかというと、CompositeViewの機能をActionフィルタに入れれば、Simple/Smarty/Flexy対応をそれぞれ考えないでいいなぁという横着な考えだったため。
けど、本来CompositeViewな機能はそれぞれのViewフィルタが担当すべき分野かなと思い直したりしました。
というわけで「RailsによるアジャイルWebアプリケーション開発」の「第17章 Action View」を見て、「やっぱRailsはこのあたりはすっきりしてるなぁ・・・」と感心したのでその方法を持ってきちゃおうかなと。
とりあえずSmartyを使っているViewフィルタで考えてみると以下のような感じかな。
- 「render」というプラグインを準備する
- テンプレート内でAction名を引数に指定すると、指定したActionを実行し処理結果をその部分に取り込むようにする(RailsのActionViewの「render_component」のパクリ)。
- テンプレートディレクトリの上位に「layout.html」というファイルがあれば、そのファイルをレイアウトファイルとして使用する(Railsのレイアウト機能のパクリ)。この場合、renderプラグインには特に引数は指定せず、その部分にActionの処理結果が反映される。
これらを踏まえるとあるActionに対するレイアウトファイルは以下のような感じになるかなと。
<html> <body> <div id="header"> {render action="header"} </div> <div id="menu"> {render action="menu"} </div> <div id="main"> {render} </div> <div id="footer"> {render action="footer"} </div> </body> </html>
レイアウト機能をOFFにしたり、上位の layout.html 以外のファイルを指定する方法も別途考えないといけないが、基本方針としてこれで試作してもいいかなと思っています。
レイアウト機能ですが、テンプレートディレクトリをさかのぼってどんどんレイアウトファイルを適用していくって機能はあったほうがいいですかね?ま、あったらあったで使えそうな気もするし、それを入れたがために上位のレイアウト機能を一部キャンセルする機能とか必要になったりするような複雑なことになるかな?