Skip to content

Utilizando WillPaginate com o formato de Endless

julianalucena edited this page Jan 6, 2011 · 7 revisions

O Endless utilizado no Redu foi feito baseado no WillPaginate. O processo de utilização é o mesmo, porém ao invés de renderizar os links de paginação, o Endless é renderizado.

#Redefinição do Renderer

Para que o WillPaginate seja renderizado de uma forma diferente (no formato de Endless) um novo Renderer para o WillPaginate foi definido no BaseController: o EndlessRenderer.

# Renderer do WillPaginate responsável por renderizar
# a paginação no formato de Endless.
class EndlessRenderer < WillPaginate::LinkRenderer
  def to_html
    if @options[:class].eql? "pagination"
      @options[:class] = "endless" # Por default, o atributo class do html do endless será "endless".
    end

    unless @collection.next_page.nil?
      html = @template.link_to_remote "mais",
        :url => url_for(@collection.next_page), :method =>:get,
        :loading => "$('.#{@options[:class]}').html('" \
        + @template.escape_javascript(@template.image_tag('spinner.gif')) + "')"

      html = html.html_safe if html.respond_to? :html_safe
      @options[:container] ? @template.content_tag(:div, html, html_attributes) : html
    end
  end
end

Para mais informações sobre esta abordagem: Roll your own pagination links with will_paginate

#Utilizando o Endless O Renderer default do WillPaginate utilizado no Redu é o PaginationListLinkRenderer, como pode ser observado no config/environment.rb:

WillPaginate::ViewHelpers.pagination_options[:renderer] = 'PaginationListLinkRenderer'

Deste modo, o WillPaginate, por default, é renderizado no formato de links de paginação.

##Indicando o renderer Quando for necessário utilizar o WillPaginate no formato de Endless, deve-se indicar o renderer alternativo a ser utilizado:

will_paginate @events, :renderer => EndlessRenderer

##Definindo o rjs Deve-se definir um rjs como resposta à requisição AJAX, o qual é responsável pelas seguintes ações:

  1. adicionar a listagem requisitada pelo usuário à listagem já existente na página visualizada;
  2. trocar o endless para que o parametro :page seja modificado para o referente a próxima página.

####courses/index.rjs:

# Adiciona a listagem requisitada pelo usuário ao elemento HTML com id "school_list".
page.insert_html :bottom, 'school_list', :partial => "courses/course_list"

# Troca o endless para que o novo link indique para a próxima página.
page.replace_html ".endless_course",
  (will_paginate @courses, :renderer => EndlessRenderer,
   :class => "endless_course",
   params => {:environment_id => params[:environment_id],
              :user_id => params[:user_id]})

#Considerações Finais Ao migrar para Rails 3, é interessante ler o seguite post: Revisited: roll your own pagination links with will_paginate and Rails 3