Нашел!
Я немного покопался в документации по ruby on rails, чтобы узнать, как работает функция render: update.
Сначала я увидел, что render: update просто вызывалupdate_page путем отправки блока кода ...
http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#method-i-update_page
И эта функция вызывает конструктор JavaScriptGenerator, отправляя view_context (который является просто экземпляром 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 - это функция ruby, которая позволяет вызывать блок в контексте... Это было именно то, что мне было нужно.
Итак, решение (или хотя бы одно рабочее решение ...) заключается в определении render_page в application_controller:
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
И мне все еще разрешено вызывать мои вспомогательные функции (так как контекст был передан)...