The_Linux_Lich
98 posts
|
É galera, nas últimas versões do Rails Edge, o paginador clássico, lento e tranqueira foi substituído(os saudosistas podem baixá-lo como um plugin)
pelo excelente will_paginate
Instale o plugin:
./script/plugin install \ svn://errtheblog.com/svn/plugins/will_paginate
No controller:
Além de suportar as mesmas mágicas do finder normal, a lógica agora está no lugar certo e você não precisa manter uma variável @projects_page.
Na view:
É só isso. O paginador assume um número de 30 registros por página por padrão, personalizável também através de mais um atributo:
Ou no modelo:
Outra maneira:
Class Project Class Project < ActiveRecord::Base
cattr_reader :per_page
@@per_page = 10
end
E você pode estilizá-lo tranquilamente:
No seu CSS:
.pagination {
padding: 3px;
margin: 3px;
}
.pagination a {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #aaaadd;
text-decoration: none;
color: #000099;
}
.pagination a:hover, .pagination a:active {
border: 1px solid #000099;
color: #000;
}
.pagination span.current {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #000099;
font-weight: bold;
background-color: #000099;
color: #FFF;
}
.pagination span.disabled {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #eee;
color: #ddd;
}
Bom, é isso ^^
|
|
|
João Victor
94 posts
|
Show! Quando sai essa versão!? Ou ja saiu!?
|
|
|
The_Linux_Lich
98 posts
|
O Rails 2.0 só Deus sabe quando, mas você pode utilizar o paginador como um plugin
|
|
|
ArthurGeek
183 posts
|
Pelo que eu saiba, o will_paginate sempre será um plugin, e não será incluso na Rails 2.0 não.
O que acontecerá, é que o Rails não terá um paginator por default, e muitos, já estão escolhendo o will_paginate como substituto. Mas ele sempre será um plugin.
|
|
|
Marcelo Júnior
811 posts
|
O will_paginate já tem implementado algo com ajax? Por exemplo: Eu tenho uma tela toda estilizada por div’s, e a lista é carregada dentro de uma div. O will_paginate já tem uma opção para que quando eu mudar de página, abrir a pagina seguinte dentro de uma div?
Da forma atual, ele abre a pagina seguinte em uma nova pagina, ou seja, ele carrega a pagina inteira. Eu já implementei isto no sistema de paginação default do rails, mas gostei do will_paginate, e gostaria de saber se ele já tem essa funcionalidade para não fazer o que já está feito.
|
|
|
The_Linux_Lich
98 posts
|
pior que não, Marcelo…você teria que reimplementar, como no paginador antigo
|
|
|
The_Linux_Lich
98 posts
|
eu também vou ter que fazer isso ^^
|
|
|
Shairon Toledo
1428 posts
|
Muito bom o will_paginate, alguém encontrou onde define-se o tamanho da janela de páginas?
|
|
|
Arthur Leon
1 post
|
Muito bom, acabei de usar. Simples, rápido e limpo. Só um detalhe, no código do view, na última linha está faltando um sinal de ‘=’. Para aparecer o hyperlink tem que ficar assim:
<%= will_paginate @projects %>
|
|
|
The_Linux_Lich
98 posts
|
vero! Corrigindo…
|
|
|
Eduardo Fiorezi
45 posts
|
Ae Galera, também uso o will paginator.
Excelente…
Uma ótima referencia é o http://railscasts.com/episodes/51 .
|
|
|
Leonardo Faria
59 posts
|
alguém sabe como traduzir o “next” e “previous”, sem ter que mudar no source do plugin?
|
|
|
Leonardo Faria
59 posts
|
Ja descobri :)
<%= will_paginate @products, options = { :prev_label => "← Anterior", :next_label => "Próximo →"} %>
Agora, alguem tem noção de como fazer: Mostrando 11 até 20 de 198 resultados?
|
|
|
Shairon Toledo
1428 posts
|
Muito bom o will_paginate, alguém encontrou onde define-se o tamanho da janela de páginas?
Leonardo, eu “Faria”
<%= will_paginate @products, :options => { :prev_label => “← Anterior”, :next_label => “Próximo →”} %>
o options um sym com apontamento. Vc deve estar de saco-cheio com essa piadinha :)
|
|
|
Leonardo Faria
59 posts
|
Shairon
boei no que você falou
(mas a piadinha é ruim mesmo. e todo mdo faz :()
|
|
|
Rodrigo Rosauro
310 posts
|
Acho que o que o Shairon disse é que no seu exemplo ta assim options = {... e deveria ser assim: :options => {...
Options é um símbolo apontando para a hash. ;)
|
|
|
Shairon Toledo
1428 posts
|
O will_paginate já tem implementado algo com ajax?
Comecei a fazer dai lembrei de pesquisar hehe. Achei aqui
adicionei o suporte a :update que não tinha
então os dois métodos o will_paginate e o page_link_or_span no arquivo view_helpers.rb do plugin
ficam assim:
def will_paginate(entries = @entries, options = {})
remote = false
if options[:remote]
remote = options[:remote]
end
base_url = {}
if options[:url]
base_url = options.delete(:url)
end
total_pages = entries.page_count
if total_pages > 1
options = options.symbolize_keys.reverse_merge(pagination_options)
page, param = entries.current_page, options.delete(:param_name)
inner_window, outer_window = options.delete(:inner_window).to_i, options.delete(:outer_window).to_i
min = page – inner_window
max = page + inner_window
- adjust lower or upper limit if other is out of bounds
if max > total_pages then min -= max – total_pages
elsif min < 1 then max += 1 – min
end
current = min..max
beginning = 1..(1 + outer_window)
tail = (total_pages – outer_window)..total_pages
visible = [beginning, current, tail].map(&:to_a).flatten.sort.uniq
links, prev = [], 0
visible.each do |n|
next if n < 1
break if n > total_pages
unless n – prev > 1
prev = n
#links << page_link_or_span((n != page ? n : nil), ‘current’, n, param)
links << page_link_or_span((n != page ? n : nil), ‘current’, n, param, remote, base_url, options[:update] || ’’)
else
- ellipsis represents the gap between windows
prev = n – 1
links << ‘…’
redo
end
end
- next and previous buttons
#links.unshift page_link_or_span(entries.previous_page, ‘disabled’, options.delete(:prev_label), param)
#links.push page_link_or_span(entries.next_page, ‘disabled’, options.delete(:next_label), param)
links.unshift page_link_or_span(entries.previous_page, ‘disabled’, options.delete(:prev_label), param,remote, base_url)
links.push page_link_or_span(entries.next_page, ‘disabled’, options.delete(:next_label), param,remote, base_url)
content_tag :div, links.join(options.delete(:separator)), options
end
end
protected
def page_link_or_span(page, span_class, text, param, remote, base_url, dom_id=’’)
unless page
content_tag :span, text, :class => span_class
else
- page links should preserve GET parameters, so we merge params
if remote
url=params.merge(param.to_sym => (page !=1 ? page : nil)).merge(base_url)
link_to_remote text, :url => url, :update => dom_id
else
link_to text, params.merge(param.to_sym => (page !=1 ? page : nil)).merge(base_url)
end
end
end
Agora dá pra usar a paradinha com ajax assim
<%= will_paginate @chips,{:remote=>true,:url=>{:controller=>'chips',:action=>'list'}, :update=>'main'} %>
|
|
|
Arthur Martins
213 posts
|
Como eu faço para instalar esse plugin em ambiente windows?
Tentei dessa forma:
ruby script/plugin install svn://errtheblog.com/svn/plugins/wi
ll_paginate
Mas o plugin não é instalado…
Alguém pode me dar um help?
|
|
|
Shairon Toledo
1428 posts
|
O svn tá instalado?
|
|
|
Arthur Martins
213 posts
|
Não esta não!!!
Preciso instalar ou há outro meio para instalar o plugin?
|
|
|
Grinvon
130 posts
|
Eu fiz um paginator customizado em Ajax, ficou bom, depois eu posto aqui como eu fiz.
|
|
|
Philipe
136 posts
|
Só 1 pequena correção ae no código do Shairon:
50. links.unshift page_link_or_span(entries.previous_page, ‘disabled’, options.delete(:prev_label), param,remote, base_url, options[:update] || ‘’)
51. links.push page_link_or_span(entries.next_page, ’disabled’, options.delete(:next_label), param,remote, base_url, options[:update] || ’’)
Faltou o “options[:update] || ’’”, ae o Proxima e Anterior n estavam funcionando pq n estava sendo especificado qual ID deveria ser atualizado!
Muito Obrigado Shairon, ficou r0x!
Edit: Fiz uma modificação também, para ter a opção :spinner tb, para mostrar a div com ID especificado para demonstrar para os usuario que a pagina está carregando!
Segue o codigo com todas as modificações:
def will_paginate(entries = @entries, options = {})
remote = false
if options[:remote]
remote = options[:remote]
end
base_url = {}
if options[:url]
base_url = options.delete(:url)
end
total_pages = entries.page_count
if total_pages > 1
options = options.symbolize_keys.reverse_merge(pagination_options)
page, param = entries.current_page, options.delete(:param_name)
inner_window, outer_window = options.delete(:inner_window).to_i, options.delete(:outer_window).to_i
min = page – inner_window
max = page + inner_window
- adjust lower or upper limit if other is out of bounds
if max > total_pages then min -= max – total_pages
elsif min < 1 then max += 1 – min
end
current = min..max
beginning = 1..(1 + outer_window)
tail = (total_pages – outer_window)..total_pages
visible = [beginning, current, tail].map(&:to_a).flatten.sort.uniq
links, prev = [], 0
visible.each do |n|
next if n < 1
break if n > total_pages
unless n – prev > 1
prev = n
#links << page_link_or_span((n != page ? n : nil), ‘current’, n, param)
links << page_link_or_span((n != page ? n : nil), ‘current’, n, param, remote, base_url, options[:spinner] || ‘’, options[:update] || ’’)
else
- ellipsis represents the gap between windows
prev = n – 1
links << ‘…’
redo
end
end
- next and previous buttons
#links.unshift page_link_or_span(entries.previous_page, ‘disabled’, options.delete(:prev_label), param)
#links.push page_link_or_span(entries.next_page, ‘disabled’, options.delete(:next_label), param)
links.unshift page_link_or_span(entries.previous_page, ‘disabled’, options.delete(:prev_label), param,remote, base_url, options[:spinner] || ‘’, options[:update] || ’’)
links.push page_link_or_span(entries.next_page, ‘disabled’, options.delete(:next_label), param,remote, base_url, options[:spinner] || ‘’, options[:update] || ’’)
content_tag :div, links.join(options.delete(:separator)), options
end
end
protected
def page_link_or_span(page, span_class, text, param, remote, base_url, spinner, dom_id=’’)
unless page
content_tag :span, text, :class => span_class
else
- page links should preserve GET parameters, so we merge params
if remote
url=params.merge(param.to_sym => (page !=1 ? page : nil)).merge(base_url)
link_to_remote text, :url => url, :update => dom_id, :loading => ‘Element[Element.show("’ + spinner + ‘“)];’, :loaded => ‘Element[Element.hide("’ + spinner + ‘“)];’
else
link_to text, params.merge(param.to_sym => (page !=1 ? page : nil)).merge(base_url)
end
end
end
|
|
|
duard
36 posts
|
Quem conseguiu fazer este plugin funcionar com ajax, poderia fazer o favor de colar o código do view_helpers.rb no http://pastie.caboo.se ?
Mais fácil que copiar daqui, sem contar que o daqui, não está funcionando, e não consegui arrumar ainda.
Exemplo de um view_helpers.rb que funciona : http://pastie.caboo.se/101715
Valeu !
|
|
|
Kleber Shimabuku
1 post
|
@Arthur,
gem install will_paginate
@duard,
Estou começando agora em Rails.
Como faria para usar esse Modulo que vc postou no link?
Obrigado.
|