Class: Kaminari::Helpers::Paginator

Inherits:
Tag
  • Object
show all
Includes:
ActionView::Context
Defined in:
lib/kaminari/helpers/paginator.rb

Overview

The main container tag

Defined Under Namespace

Classes: PageProxy

Instance Method Summary collapse

Methods inherited from Tag

#page_url_for

Constructor Details

#initialize(template, options) ⇒ Paginator

:nodoc:



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/kaminari/helpers/paginator.rb', line 14

def initialize(template, options) #:nodoc:
  @window_options = {}.tap do |h|
    h[:window] = options.delete(:window) || options.delete(:inner_window) || Kaminari.config.window
    outer_window = options.delete(:outer_window) || Kaminari.config.outer_window
    h[:left] = options.delete(:left) || Kaminari.config.left
    h[:left] = outer_window if h[:left] == 0
    h[:right] = options.delete(:right) || Kaminari.config.right
    h[:right] = outer_window if h[:right] == 0
  end
  @template, @options = template, options
  @theme = @options[:theme] ? "#{@options[:theme]}/" : ''
  @options[:current_page] = PageProxy.new @window_options.merge(@options), @options[:current_page], nil
  #FIXME for compatibility. remove num_pages at some time in the future
  @options[:total_pages] ||= @options[:num_pages]
  @options[:num_pages] ||= @options[:total_pages]
  @last = nil
  # initialize the output_buffer for Context
  @output_buffer = ActionView::OutputBuffer.new
end

Instance Method Details

#each_relevant_pageObject Also known as: each_page

enumerate each page providing PageProxy object as the block parameter Because of performance reason, this doesn’t actually enumerate all pages but pages that are seemingly relevant to the paginator. “Relevant” pages are:

  • pages inside the left outer window plus one for showing the gap tag

  • pages inside the inner window plus one on the left plus one on the right for showing the gap tags

  • pages inside the right outer window plus one for showing the gap tag



46
47
48
49
50
51
52
# File 'lib/kaminari/helpers/paginator.rb', line 46

def each_relevant_page
  return to_enum(:each_relevant_page) unless block_given?

  relevant_pages(@window_options.merge(@options)).each do |i|
    yield PageProxy.new(@window_options.merge(@options), i, @last)
  end
end

#page_tag(page) ⇒ Object



64
65
66
# File 'lib/kaminari/helpers/paginator.rb', line 64

def page_tag(page)
  @last = Page.new @template, @options.merge(:page => page)
end

#render(&block) ⇒ Object

render given block as a view template



35
36
37
38
# File 'lib/kaminari/helpers/paginator.rb', line 35

def render(&block)
  instance_eval(&block) if @options[:total_pages] > 1
  @output_buffer
end

#to_sObject

:nodoc:



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/kaminari/helpers/paginator.rb', line 76

def to_s #:nodoc:
  subscriber = ActionView::LogSubscriber.log_subscribers.detect {|ls| ls.is_a? ActionView::LogSubscriber}

  # There is a logging subscriber
  # and we don't want it to log render_partial
  # It is threadsafe, but might not repress logging
  # consistently in a high-load environment
  if subscriber
    unless defined? subscriber.render_partial_with_logging
      class << subscriber
        alias_method :render_partial_with_logging, :render_partial
        attr_accessor :render_without_logging
        # ugly hack to make a renderer where
        # we can turn logging on or off
        def render_partial(event)
          render_partial_with_logging(event) unless render_without_logging
        end
      end
    end

    subscriber.render_without_logging = true
    ret = super @window_options.merge(@options).merge :paginator => self
    subscriber.render_without_logging = false

    ret
  else
    super @window_options.merge(@options).merge :paginator => self
  end
end