2010/11/06

Rails3 で RJS の page オブジェクトを拡張する

例えば、facebox や fancybox のような Lightbox 系のスクリプトを使う場合、毎度毎度スクリプトを出力するコードはかかないですよね。
で、一度サーバ側で処理が必要な場合が多いので、Rails ではたいてい RJS などを使って AJAX 処理をすると思います。
その場合、helper に処理を書いてしまうのが楽なのですが、引数に page オブジェクトを渡す必要があります。
def popup(page, partial_name, locals)
  # popup 内の html を定義してある div を非同期更新
  page[:popup].replace_html :partial => partial_name, :locals => locals
  # facebox はたしかこんな感じで出せたと思う。うろ覚え
  page << '$.facebox($("#popup").html());'
end
でも、page.popup(partial_name, locals) とかけたほうがスマートな気がする。 page オブジェクトは ActionView::Helpers::PrototypeHelper::JavaScriptGenerator のインスタンスなのでこれを拡張してみる。
class ActionView::Helpers::PrototypeHelper::JavaScriptGenerator
  def popup(partial_name, locals)
    self[:popup].replace_html :partial => partial_name, :locals => locals
    self << '$.facebox($("#popup").html());'
  end
end
単純に page を self に書き換えただけ。ところがこれだとエラーがでる。 self に [] が定義されていないらしい。 というのも、page オブジェクトの各種メソッドが定義されているのは、さらに内部のモジュールである GeneratorMethods だからみたい。 というわけで、
module ActionView::Helpers::PrototypeHelper::JavaScriptGenerator::GeneratorMethods
  def popup(partial_name, locals)
    self[:popup].replace_html :partial => partial_name, :locals => locals
    self << '$.facebox($("#popup").html());'
  end
end
これで OK

0 件のコメント :

コメントを投稿