Module: AjaxPagination::ControllerAdditions::ClassMethods
- Defined in:
- lib/ajax_pagination/controller_additions.rb
Instance Method Summary collapse
-
#ajax_respond(options = {}) ⇒ Object
Adds default render behaviour for AJAX requests for a section with matching a certain name.
Instance Method Details
#ajax_respond(options = {}) ⇒ Object
Adds default render behaviour for AJAX requests for a section with matching a certain name. By default, this name is the empty string. However, it can be changed.
An AJAX request for the matched section will render a partial, which by default, is the template named “_#ajax_section_name”, or if it does not exist, the view template matching the controller/action name. By default there is no layout used.
Options:
- :
section_id
-
The AJAX section name which should be matched to invoke AJAX Pagination response. Defaults to “global”.
- :
render
-
Overrides default render behaviour for AJAX Pagination, which is to render the partial with name matching the section_id option, or if it does not exist, renders the default template
- :
only
-
The actions that may trigger this render behaviour for AJAX requests. If an action is not included, it will not trigger this behaviour.
- :
except
-
Actions which will not trigger this render behaviour for AJAX requests.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/ajax_pagination/controller_additions.rb', line 33 def ajax_respond( = {}); # instead of defining default render normally, we save an unbound reference to original function in case it was already defined, since we want to retain the original behaviour, and add to it (if the method is redefined after, this new behaviour is lost, but at least we don't remove others' behaviour - note that this also allows multiple invocations of this with different parameters) section_id = [:section_id] || "global" section = section_id.to_sym view = [:render] || {} view = { :action => view } if view.kind_of? String only = [:only] ? Array([:only]) : nil except = Array([:except]) || [] if @_ajax_respond.nil? # has this method been called before? @_ajax_respond = {} _ajax_respond = @_ajax_respond # create reference to class instance variable # create default_render intercepting method (if not already defined) default_render = self.instance_method(:default_render) # get a reference to original method define_method(:default_render) do |*args| action = action_name.to_sym render = nil # nil means call original default_render method if ajax_section && _ajax_respond.has_key?(ajax_section) && request.format == "html" # might override render... let's find out if _ajax_respond[ajax_section][1].has_key?(action) render = _ajax_respond[ajax_section][1][action] # use action-specific render hash for this ajax_section (can still be nil) else render = _ajax_respond[ajax_section][0] # use default render hash for this ajax_section (can still be nil) end end if !render.nil? # AJAX response overriding normal default_render behaviour respond_to do |format| ajax_respond format, :section_id => ajax_section, :render => render end else # otherwise do what would have been done default_render.bind(self).call(*args) # call original method of the same name end end end @_ajax_respond[section] ||= [nil,{}] if only.nil? except.each {|x| @_ajax_respond[section][1][x.to_sym] = @_ajax_respond[section][0] unless @_ajax_respond[section][1].has_key? x.to_sym } # sets excluded actions to old default (if not already set) @_ajax_respond[section][0] = view # creates default for all other actions else @_ajax_respond[section][1] = Hash[(only - except).map { |x| [x.to_sym,view] }] # sets specific actions to view render options end end |