Stránkování v Ruby on Rails – Will_paginate
by petrb on Oct.05, 2009, under Pluginy, Ruby on Rails
Plugin si můžete stáhnout z následující adresy: http://github.com/mislav/will_paginate/
Na této adrese také naleznete základní informace o tom jak tento plugin využívat. Nějaké informace se dozvíte i tady :)
Aby nám plugin fungoval (rails > 2.1) je potřeba jej povolit v “config/enviroment.rb”
Rails::Initializer.run do |config|
config.gem 'mislav-will_paginate', :version => '~> 2.3.11', :lib => 'will_paginate', :source => 'http://gems.github.com'
end
Tento plugin a chybějící dependence NAINSTALUJEME když v konzoli napíšeme následující příkaz:
rake gems:install
a nebo druhou možností je manuální instalace pomocí následujících příkazů:
gem sources -a http://gems.github.com
gem install mislav-will_paginate
POUŽITÍ:
- @clanky = Post.find(:all, :order => 'datum DESC')
Výše uvedeným dotazem vypíšeme všechny články, které vyhovují podmínkám (takže všechny). Pokud bysme chtěli tyto články nastránkovat pomocí will paginate pluginu, provedeme jen malinkatou úpravu.
- @clanky = Post.paginate(:all, :order => 'datum DESC', :page => params[:page])
Jak jste si asi všimli místo find jsem použil paginate, ten funguje stejně jako find, ale jen s tím rozdílem, že nevytáhne z DB všechny záznamy. Nesmíme ale zapomenout na parametr page, bez něj skončíme s chybou. Takto se nám výsledky nastránkují po 30 záznamech (defaultní hodnota). Tu samozřejmě můžeme změnit, když nastavíme per_page parametr. Takže stránkování po 10 záznamech by mohlo vypadat následovně.
- @clanky = Post.paginate(:all, :order => 'datum DESC', :page => params[:page], :per_page => 10)
Tak a to je v controlleru vše a teď už jen potřebujeme vypsat články a taky naše stránkování.
- <ul> - <% @clanky.each do |clanek| %> - <li><%= clanek.titulek %></li> - <% end %> - </ul> - <%= will_paginate(@clanky) %>
Stačí když zavoláme funkci will_paginate s naší proměnou a máme pěkně nastránkováno. :)
ÚPRAVY:
Pravděpodobně budou všechny trápit i anglické názvy u tlačítek NEXT a PREVIOUS (další a předchozí). I na tohle, ale existuje velmi lehké a elegantní řešení. V souboru “config/enviroment.rb” přidáme následující řádky a po restartu by mělo být tak jak má :)
require 'will_paginate' WillPaginate::ViewHelpers.pagination_options[:previous_label] = 'Novější' WillPaginate::ViewHelpers.pagination_options[:next_label] = 'Starší'
Takto nastavíme všechny tlačítka v aplikaci (globálně všechny přepíšeme), ale existuje ještě jedna možnost, a to lokální. Pokud chceme změnit text jen u jednoho tlačítka, tak to můžeme udělat přímo a to tak, že přidáme další dva parametry :previous_label (pro předchozí tlačítko) a pak :next_label (pro tlačítko další). Vypadalo by to následovně.
@clanky = Post.paginate( ..... , :previous_label => 'Předchozí', :next_label => 'Další')
Pokud budete chtít smazat číslování, tak úprava je taktéž jednoduchá, přidáme jen :page_links a nastavíme jej na false.
Na závěr snad už jen doplním, že ve složce examples (link: http://github.com/mislav/will_paginate/blob/master/examples/index.html) se můžete podívat na nějaké CSS styly, tak to jen tak, kdyby se někomu nelíbilo standardní stylování.
V dalším pokračování si ukážeme stránkování pomocí AJAXu.
Nějaké dotazy, poznámky nebo připomínky?
Petr