lib/apotomo/rails/controller_methods.rb in apotomo-1.2.5 vs lib/apotomo/rails/controller_methods.rb in apotomo-1.2.6

- old
+ new

@@ -1,38 +1,39 @@ require 'apotomo/request_processor' +require 'uber/inheritable_attr' module Apotomo module Rails # Lazy-loads Apotomo support into controllers when needed. module ControllerMethodsLoader def has_widgets(*args, &block) include ControllerMethods has_widgets(*args, &block) end end - - + + module ActionViewMethods delegate :render_widget, :url_for_event, :to => :controller end - + module ControllerMethods include WidgetShortcuts extend ActiveSupport::Concern - + included do - extend Hooks::InheritableAttribute + extend Uber::InheritableAttr extend WidgetShortcuts - + inheritable_attr :has_widgets_blocks self.has_widgets_blocks = [] - + helper ActionViewMethods end - + module ClassMethods - # Yields the root widget to setup your widgets for a controller. The block is executed in + # Yields the root widget to setup your widgets for a controller. The block is executed in # controller _instance_ context, so you may use instance methods and variables of the # controller. # # Example: # class PostsController < ApplicationController @@ -41,55 +42,55 @@ # end def has_widgets(&block) has_widgets_blocks << block end end - + def apotomo_request_processor return @apotomo_request_processor if @apotomo_request_processor - + # happens once per request: options = {:js_framework => Apotomo.js_framework} - + @apotomo_request_processor = Apotomo::RequestProcessor.new(self, options, self.class.has_widgets_blocks) end - + def apotomo_root apotomo_request_processor.root end - + def render_widget(*args, &block) apotomo_request_processor.render_widget_for(*args, &block) end - + def render_event_response page_updates = apotomo_request_processor.process_for(params) - + return render_iframe_updates(page_updates) if params[:apotomo_iframe] - + render :text => page_updates.join("\n"), :content_type => Mime::JS end - + # Returns the url to trigger a +type+ event from +:source+, which is a non-optional parameter. # Additional +options+ will be appended to the query string. # # Note that this method will use the framework's internal routing if available (e.g. #url_for in Rails). # # Example: # url_for_event(:paginate, :source => 'mouse', :page => 2) # #=> http://apotomo.de/mouse/process_event_request?type=paginate&source=mouse&page=2 def url_for_event(type, options) options.reverse_merge!(:type => type) - + apotomo_event_path(apotomo_request_processor.address_for(options)) end - + protected # Renders the page updates through an iframe. Copied from responds_to_parent, # see http://github.com/markcatley/responds_to_parent . def render_iframe_updates(page_updates) escaped_script = Apotomo::JavascriptGenerator.escape(page_updates.join("\n")) - + render :text => "<html><body><script type='text/javascript' charset='utf-8'> var loc = document.location; with(window.parent) { setTimeout(function() { window.eval('#{escaped_script}'); window.loc && loc.replace('about:blank'); }, 1) } </script></body></html>", :content_type => 'text/html' end