2007年7月5日木曜日

ViewのDRY

Viewを書いていると、他のControllerのAction結果を使いたいことが
多々あります。これをコピペでやってしまうと、DRYが守れません。

ということで、かるくまとめ。

<Viewで他のAction結果を読み込む>
  Viewでrender_componentを使います。
  <%= render_component :controller => "documents", :action => "list", :id =>@sum.id %>
  これで、他のViewにて違うControllerのアクション結果を表示出来ます。
  注意点は、呼び出される側のActionで
  render :layout => false
  を実施しておくこと。
  これをしないと<html>も出て来てしまいます。

  ということで、この方法を使えば複数のコントロールにあるshowのような
  詳細表示部分を、1ページにまとめるなどが簡単に行なえます。便利!

<Action内で、他のAction結果を受け取る>
  Viewで使うrender_componentですが、これをControllerのActionで呼び出して
  出力されるHTMLを別のActionから返す場合
  つまり
   -->  Action1(受付窓口) --> Action2(処理とHTML生成)
という風にリクエスト内容を送って、Action2の結果をAction1で受け取ってから
  リクエスト元に返したい場合はrender_component_as_stringを使います。
  これを使うと、評価結果が文字列として取得出来るので、さらにAction1で追加を
  書いてから送り返すなども可能です。

この2つを使うことでViewのDRY化がだいぶ進むと思ってます。
概念的に上位のモデルのShowにて、has_manyやhas_oneに
なっている下位のモデルを取得し、そのIDを渡して下位のControllerの
Showを呼び出します。
その結果をはめ込んで送る・・・・というのを繰り返せば、それぞれのモデルの
Showを連携させて1ページを合成することができるし、
ShowからAJAXでEditやDestroyを呼び出す様に変えると
ユーザーの見た目は1つのレコードを編集しているつもりでも、
DB上は複数のテーブルにまたがって修正していることになり、
かつそれらを別々のControllerに置いておけます。

この二つをうまく使うのがViewのDRY化を進める上で不可欠かと思います。
もちろんpartialで逃がすのも手ですが、Partialは一つのモデルに対して
DRYを促進する機能だと解釈してます。

0 件のコメント: