2011-08-10 28 views
2

私はajaxリクエストを受け取るたびにdivのセットを置き換えたいと思っています(私がやっているウェブサイトは完全なAjaxです...)。たとえば、受信トレイ内のメッセージ数を確認したり、ユーザーの統計情報を表示したりすることができます。レンダリング前に関数を呼び出す

私のコードで何度もこの呼び出しを自分のレンダリング機能に繰り返してもらうことはできません。

before_filterで関数を呼び出そうとしましたが、render:updateを呼び出すので、2回目は機能しません。

私はapplication_controllerに私自身の機能render_pageを作成しようとしました:

def render_page 
    render :update do |page| 
    yield(page) 
    # page.replace_html :div, ... 
    end 
end 

しかし、どういうわけかコンテキストが失われているように見える:私は、コントローラの機能にrender_pageを呼び出すとき、私はヘルパー関数にアクセスすることはできません...

ありがとうございます!

+1

答えではありませんが、コントローラのヘルパーにアクセスするには、それらをインクルードする必要があります: 'include RoutesHelper'。編集:これはあなたのコントローラのアクションで呼び出す必要がありますか?私はpage.replace_htmlがあなたの.js.erbファイル内で呼び出されるべきだと考えました... – Robin

+0

技術的には動作しますが、MVC組織にはうまくいきません。繰り返されることなく、各.js.erbファイルの最後に同じコード部分を実行することは可能ですか? – sdrdis

答えて

2

見つけました!

私は、レンダリング:更新機能の仕組みを調べるために、ruby on railsドキュメントに少し掘り下げました。

まず、私はそれがレンダリング見た:アップデートは単に...コード・ブロックを送信することにより、

http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#method-i-update_page

update_pageを呼び出しましたが、この関数は単純である(view_contextを送信することにより、JavaScriptGeneratorのコンストラクタを呼び出していますActionView :: Baseのインスタンス)。

JavaScriptGenerator.new(view_context, &block).to_s.html_safe 

http://apidock.com/rails/ActionView/Helpers/PrototypeHelper/JavaScriptGenerator/new/class

そしてJavaScriptGeneratorのコンストラクタで、私たちは

def initialize(context, &block) #:nodoc: 
    @context, @lines = context, [] 
    include_helpers_from_context 
    @context.with_output_buffer(@lines) do 
    @context.instance_exec(self, &block) 
    end 
end 

instance_execは、コンテキスト内でブロックを呼び出すことができますルビーの機能であるを観察することができます...まさにそれでした必要だった。だから、ソリューション(あるいは少なくとも一つの作業溶液が...)application_controllerでrender_pageを定義することです

def render_page(&block) 
    render :update do |page| 
    page << 'console.log("before_code");' 
    self.instance_exec(page, &block) 
    page << 'console.log("after_code");' 
    end 
end 

この方法では、代わりに私のコントローラで

render :update do |page| 
    page.replace_html ... 
    helper_functions... 
end 
を呼び出します

電話する

render_page do |page| 
    page.replace_html ... 
    helper_functions... 
end 

私はまだ許可しています

関連する問題