Pluginy
Stránkování v Ruby on Rails – will_paginate + AJAX
by petrb on Oct.10, 2009, under Pluginy, Ruby on Rails
Mnoho lidí se ptá jak vytvořit stránkování pomocí AJAXu. I když se to nezdá je to velice jednoduché. Pokud nevíte jak se pracuje s pluginem will paginate, tak si přečtěte tento článek, budete to potřebovat :)
Nejdříve si musíme natáhnout v hlavičce potřebné soubory.
<%= javascript_include_tag :defaults, 'lowpro' %>
Jak už jste si všimli je potřeba stáhnout low pro knihovnu, kterou napsal Dan Webb. Toto rozšíření pro prototype lze stáhnout zde. Jakmile budete mít aktuální verzi, je potřeba ji nakopírovat do složky “public/javascript”. Poté si otevřete application.js z “public/javascript” složky a vložte do něj následující kód.
Event.addBehavior.reassignAfterAjax = true; Event.addBehavior({
'div.pagination a' : Remote.Link
})
Taktéž si můžete vytvořit jakýkoliv *.js soubor a vložit kód tam, ale pak je potřeba tento soubor z hlavičky zavolat spolu s lowpro.
Tak a teď máme nachystáno co budeme potřebovat a nyní jsme jen pár řádků od kýženého výsledku. V controlloreru si vybereme potřebná data a nastránkujeme pomocí will paginate, ale taky je potřeba zajistit odpověd na js request.
def index
@posts = Post.paginate(:all, :per_page => 10, :page => params[:page])
respond_to do |format|
format.html
format.js do
render :update do |page|
page.replace 'posts_box', :partial => [:posts];
end
end
end
end
Kód ve view (index.rhtml) by mohl vypadat následovně.
Nalezené články:
<%= render :partial => "posts" %>
------- #_posts.rhtml -------
<div id="post_box">
#zde vypiseme co chceme a nastránkujeme
<%= will_paginate(@posts) %>
</div>
Tak a to je všechno. :)
Petr Bobek
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