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 ^^
|
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
763 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.
|
Shairon Toledo
1205 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 :)
|
Shairon Toledo
1205 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'} %>
|
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 < 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
|