加藤です。
Railsで、ブログのようにサイドバーへリンクメニューやカレンダーなどの小さなパーツ(ウィジェット)を表示する時は、大抵パーシャルやコンポーネントを使います。そういう際に、ひとつのレイアウトでフレキシブルに表示させるためのお手軽なTipsです。
まず、ApplictionHelperにパーシャルかコンポーネントかを判断してレンダリングを振り分けるヘルパメソッドを追加します。renderメソッドにブロックが渡せなくなりますが、どうせRJSの時ぐらいしか使わないので気にしません。
def render_widget(widget)
if widget.key?(:controller) || widget.key?(:action)
render_component widget
else
render widget
end
end
コントローラ側ではウィジェット用のハッシュオブジェクトを必要なぶんだけ追加します。
@widgets = [
{:partial => "link_list"},
{:controller => "calendar", :action => "monthly"}
]
ビューでは先ほどのヘルパメソッドを使って、コントローラ側で生成したウィジェットを表示します。
<div id="sidebar">
<% for widget in @widgets %>
<%= render_widget(widget) %>
<% end %>
</div>
ウィジェット定義自体をモデル化してacts_as_listで並び替えできるようにすれば、ユーザーに並び順を変えてもらうこともできますね。