Instalace:
$
script/plugin install will_paginate
Když máme plugin will_paginate
nainstalován, můžeme přistoupit k jeho použití. V následujícím příkladu máme tabulku listy
s datovým modelem List
. V metodě index
řadiče chceme vyhledat a zobrazit paginátorem seznam listů.
Připomínám že vztah mezi list a listy je definován v inflektoru.
Použítí stránkovače (paginator) v příkladu rovnou protlačím z řadiče do modelu, a zobrazení provedu v tabulce.
Tak tedy nějdřív model a použití stránkovače. V třídě modelu definuji metodu search
jenž nedělá nic jiného než že volá vlastní paginátor
Popíši rovnou řešení s stránkovačem (pagniator) v modelu. Ušetří nám to čas. Takže v modelu definujeme vyhledávací metodu která bude provádět stránkování. Všechny parametry budu do této metody předávat v hashi options
. Uvnitř přidáme předané parametry k defaultním hodnotám. Tyto definovat nepotřebujeme, ale je vhodné podle dat v modelu a podle plánovaného použití si je připravit.
# Vyhledávání a paginátor def self.search(options = {}) paginate({ :per_page => 5, :order => 'id'}.merge options) end
Vytvořenou metodu pro vyhledání zázanmů nyní použijeme v řadiči. Místo standardního
def index listy = List.find(:all, …) end
Použijeme novou metodu search
. Jediným rozdílem je vypuštění symbolu :all
, který nemá v této situaci smysl. Všechny ostatní parametry zachováme. Výsledný kód bude nyní vypadat takto:
def index
listy = List.search({…}, :params => params[:page])
end
Zbývá nám ještě napsat pohled. V tom od začátku použiji partials a tak bude rozdělen do dvou souborů. Rovněž vyjdu ze zobrazení dat v tabulce. Nejdříve tedy app/view/lisr/index.html.erb
. V tomto jsou důležité dva řádky. První vloží do pohledu navigační část paginátoru. Jedná se o volání will_paginate
kterému předáme kolekci objektů získanou v řadiči. Druhý důležitý řádek je přesun zobrazení řádků do table_row
pomocí render_collection_of_partials
.
<table>
<thead>
<tr><th>#</th><th>název</th>…</tr>
</thead>
<tfoot>
<tr>
<td colspan="…"><%= will_paginate @listy%></td>
</tr>
</tfoot>
<tbody>
<%= render_collection_of_partials 'table_row', @listy%>
</tbody>
</table>
Zobrazením řádku tabulky vše dokončíme. Toto je popsáno v souboru app/view/list/_table_row.html.erb
. Zde je jen jedna „zvláštnost“, a to proužkování řádků tabulky definováním css třídy.
<tr class="<%= cycle('odd', 'even')%>"> <td><%= table_row.id %></td> <td><%= table_row.name %></td> …další sloupce tabulky </tr>
V příkladu jsou zapracovány i některé další techniky, jako je například proužkování tabulky. To zajišťuje ve spolupráci s nastavením v stylesheeto definování class
v elementu tr