2011-08-10 4 views
2

저는 Ajax 요청을받을 때마다 div 세트를 교체하고 싶습니다. (제가하고있는 웹 사이트는 아약스입니다 ...). 예를 들어,받은 편지함에있는 메시지의 수를 확인하거나 사용자 통계를 표시 할 수 있습니다. ...렌더링하기 전에 함수 호출

내 코드에서이 호출을 여러 번 반복해서 호출하지 않아도됩니다.

before_filter에서 함수를 호출하려고 시도했지만 render : update를 호출 한 이후로 두 번째로 작동하지 않습니다.

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

을하지만 어떻게 든 상황을 잃게하는 것 :

나는 application_controller에 내 자신의 기능 render_page를 만들려고 내가 컨트롤러의 기능에 render_page를 호출 할 때, 나는 도우미 기능에 액세스 할 수 없습니다 ...

감사합니다.

+1

답변이 없지만 컨트롤러의 도우미에 액세스하려면 'include RoutesHelper'를 포함해야합니다. 편집 :하지만 컨트롤러 액션에서 호출되어야한다고 확신합니까? 나는 page.replace_html이 .js.erb 파일에서 호출되어야한다고 생각했습니다 ... – Robin

+0

기술적으로는 작동하지만 MVC 조직에는 좋지 않습니다.하지만 문제는 남아 있습니다. 반복없이 각 .js.erb 파일의 끝에 동일한 코드 부분을 실행할 수 있습니까? – sdrdis

답변

2

발견!

나는 render : update 함수가 어떻게 작동하는지 알아보기 위해 레일즈 문서의 루비 문서를 조금 썼다.

첫째, 그 렌더링 보았다 업데이트가 단순히 ... 코드 블록을 전송하여

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

update_page를 호출했다 그리고이 기능은 단순히 인 (view_context을 보내 JavaScriptGenerator의 생성자를 호출 ActionView :: Base의 인스턴스).

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을 관찰 할 수

JavaScriptGenerator.new(view_context, &block).to_s.html_safe 
는 그했다 ... 컨텍스트 내에서 블록을 호출 할 수 있습니다 루비 기능을 정확히 내가 필요.

그래서, 솔루션 (또는 적어도 하나의 작업 솔루션은 ...) 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 

나는 여전히 허용하고 있습니다. (컨텍스트가 전달되었으므로) 도우미 함수를 호출 할 때 ...

관련 문제