前の記事でも書いた、render_componentにまつわる問題を解消すべく、
ヘルパを作ってみた。
render_componentの問題点は、以下の二つ。
1.request.xhr?で必ず読み出した元Viewのrequest.xhr?の結果が返される。
2.全ての処理が終わってからリクエストが返るので、レンダリングが遅い。
render_componentでは、
1.viewファイルを解釈
2.render_component登場
3.コントローラで処理
4.コントローラのrender :partialをレンダリング
5.レンダリング結果をViewに差し込む
6.次の行を解釈
という風に、とにかく全ての処理が流れてしまう。
で、2.~5.までの処理をとにかく速く終わらせて戻し、
実体部分は非同期で別に呼び出す方向で考える。
というわけで、ヘルパにdelayed_render_componentを作ってみた。
def delayed_render_component(options)
# code = "Element.update('#{options[:update]}','#{render :partial=>'common/progressing'}')"
code = "new Ajax.Updater(#{remote_function(options)})"
javascript_tag(code)
end
使い方はlink_to_remoteを参照。
出来れば、Ajax.Updaterが戻る迄の間、プログレスアイコンでも表示したい所なんだけど、
なかなかうまくいかない。
というのも、ターゲットの書き換えだけならまだしも、
書き換えではなく、書き足し(要素を最後に挿入(:position=>'bottom'とか))などしたときに、
Element.Updateを使えないから。
対象の書き換えだけなら、
コメントアウトした行を復活させるだけでいいんだけどねえ・・・
書き足しの時には、
1.プログレスアイコンを表示するエレメントを挿入
2.Ajax.Updaterが戻って、エレメントが挿入される
3.1.のエレメントを削除
というプロセスを経なければならないという・・・
はじめから要素にランダムなIDを振ればよいかというと、
レンダリングされた要素の中身でIDを対象としていろいろ操作するのでそうも行かない。
何かいい解決方法を考えなくっちゃね。