발견!
나는 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
나는 여전히 허용하고 있습니다. (컨텍스트가 전달되었으므로) 도우미 함수를 호출 할 때 ...
답변이 없지만 컨트롤러의 도우미에 액세스하려면 'include RoutesHelper'를 포함해야합니다. 편집 :하지만 컨트롤러 액션에서 호출되어야한다고 확신합니까? 나는 page.replace_html이 .js.erb 파일에서 호출되어야한다고 생각했습니다 ... – Robin
기술적으로는 작동하지만 MVC 조직에는 좋지 않습니다.하지만 문제는 남아 있습니다. 반복없이 각 .js.erb 파일의 끝에 동일한 코드 부분을 실행할 수 있습니까? – sdrdis