-
Notifications
You must be signed in to change notification settings - Fork 2
Utilizando WillPaginate com o formato de Endless
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 elemento 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
Código HTML gerado pelo código Ruby acima:
<div class="endless"><!-- Se nenhuma classe for indicada, "endless" será utilizada -->
<a onclick="jQuery.ajax({beforeSend:function(request){$('.endless').html('<img alt='Spinner'
src='/images/spinner.gif?1287775413' />');}, dataType:'script', type:'get',
url:'/espacos/1-banco-de-dados-avancados/events?page=2'}); return false;" href="#">mais</a>
</div>
##Definindo o rjs Deve-se definir um rjs como resposta à requisição AJAX, o qual é responsável pelas seguintes ações:
- adicionar a listagem requisitada pelo usuário à listagem já existente na página visualizada;
- 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