<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ruby on Rails &#187; petrb</title>
	<atom:link href="http://petrbobek.cz/clanky/author/petrb/feed/" rel="self" type="application/rss+xml" />
	<link>http://petrbobek.cz</link>
	<description>Just like RORck</description>
	<lastBuildDate>Sat, 10 Oct 2009 15:59:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Stránkování v Ruby on Rails &#8211; will_paginate + AJAX</title>
		<link>http://petrbobek.cz/clanky/strankovani-v-ruby-on-rails-will_paginate-ajax/</link>
		<comments>http://petrbobek.cz/clanky/strankovani-v-ruby-on-rails-will_paginate-ajax/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 13:36:51 +0000</pubDate>
		<dc:creator>petrb</dc:creator>
				<category><![CDATA[Pluginy]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[stránkování]]></category>
		<category><![CDATA[will paginate]]></category>

		<guid isPermaLink="false">http://petrbobek.cz/?p=113</guid>
		<description><![CDATA[Minule jsme si ukázali jak si jednoduše nastránkovat data pomocí pluginu will_paginate a v dnešním dílu si ukážeme jak tento plugin můžeme rozšířit pomocí AJAXu.]]></description>
			<content:encoded><![CDATA[<p>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 <a title="Stránkování pomocí pluginu will paginate" href="http://petrbobek.cz/clanky/strankovani-v-ruby-on-rails-will_paginate/" target="_blank">tento</a> článek, budete to potřebovat :)</p>
<p>Nejdříve si musíme natáhnout v hlavičce potřebné soubory.</p>
<pre class="brush: ruby;">
&lt;%= javascript_include_tag :defaults, 'lowpro' %&gt;
</pre>
<p>Jak už jste si všimli je potřeba stáhnout <a title="rozšíření pro prototype" href="http://www.danwebb.net/lowpro" target="_self">low pro</a> knihovnu, kterou napsal <a title="Dan Webb" href="http://www.danwebb.net" target="_self">Dan Webb</a>. Toto rozšíření pro prototype lze stáhnout <a title="Aktuální verze low pro" href="http://github.com/danwrong/low-pro/raw/2f47a651ab1143b2e067de7d2381f615c389a14e/dist/lowpro.js" target="_self">zde</a>. Jakmile budete mít aktuální verzi, je potřeba ji nakopírovat do složky &#8220;public/javascript&#8221;. Poté si otevřete application.js z &#8220;public/javascript&#8221; složky a vložte do něj následující kód.</p>
<pre class="brush: ruby;">
Event.addBehavior.reassignAfterAjax = true; Event.addBehavior({
    'div.pagination a' : Remote.Link
})
</pre>
<p>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.</p>
<p>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.</p>
<pre class="brush: ruby;">def index
    @posts = Post.paginate(:all, :per_page =&gt; 10, :page =&gt; params[:page])

    respond_to do |format|
       format.html
       format.js do
          render :update do |page|
             page.replace 'posts_box', :partial =&gt; [:posts];
          end
       end
    end
end</pre>
<p>Kód ve view (index.rhtml) by mohl vypadat následovně.</p>
<pre class="brush: ruby;">Nalezené články:
&lt;%= render :partial =&gt; &quot;posts&quot; %&gt;
------- #_posts.rhtml -------
&lt;div id=&quot;post_box&quot;&gt;
#zde vypiseme co chceme a nastránkujeme
    &lt;%= will_paginate(@posts) %&gt;
&lt;/div&gt;</pre>
<p>Tak a to je všechno. :)<br />
Petr Bobek</p>
]]></content:encoded>
			<wfw:commentRss>http://petrbobek.cz/clanky/strankovani-v-ruby-on-rails-will_paginate-ajax/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Stránkování v Ruby on Rails &#8211; Will_paginate</title>
		<link>http://petrbobek.cz/clanky/strankovani-v-ruby-on-rails-will_paginate/</link>
		<comments>http://petrbobek.cz/clanky/strankovani-v-ruby-on-rails-will_paginate/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 16:06:15 +0000</pubDate>
		<dc:creator>petrb</dc:creator>
				<category><![CDATA[Pluginy]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[stránkování]]></category>
		<category><![CDATA[will paginate]]></category>

		<guid isPermaLink="false">http://petrbobek.cz/?p=83</guid>
		<description><![CDATA[Pravděpodobně se velmi často setkáváte se situací kdy potřebujete vybraná data nastránkovat, jelikož je jich na stránce hodně. Použitím pluginu will-paginate je stránkování velmi jednoduché a přímočaré.]]></description>
			<content:encoded><![CDATA[<p>Plugin si můžete stáhnout z následující adresy: <a href="http://github.com/mislav/will_paginate/">http://github.com/mislav/will_paginate/<br />
</a>Na této adrese také naleznete základní informace o tom jak tento plugin využívat. Nějaké informace se dozvíte i tady :)</p>
<p>Aby nám plugin fungoval (rails &gt; 2.1) je potřeba jej povolit v &#8220;config/enviroment.rb&#8221;</p>
<pre class="brush: ruby;">Rails::Initializer.run do |config|
    config.gem 'mislav-will_paginate', :version =&gt; '~&gt; 2.3.11', :lib =&gt; 'will_paginate', :source =&gt; 'http://gems.github.com'
end</pre>
<p>Tento plugin a chybějící dependence NAINSTALUJEME když v konzoli napíšeme následující příkaz:</p>
<pre class="brush: ruby;">rake gems:install</pre>
<p>a nebo druhou možností je manuální instalace pomocí následujících příkazů:</p>
<pre class="brush: ruby;">gem sources -a http://gems.github.com</pre>
<pre class="brush: ruby;">gem install mislav-will_paginate</pre>
<p><span style="color: #ff6600;">POUŽITÍ:</span></p>
<pre class="brush: ruby;">- @clanky = Post.find(:all, :order =&gt; 'datum DESC')</pre>
<p>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.</p>
<pre class="brush: ruby;">- @clanky = Post.paginate(:all, :order =&gt; 'datum DESC', :page =&gt; params[:page])</pre>
<p>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ě.</p>
<pre class="brush: ruby;">- @clanky = Post.paginate(:all, :order =&gt; 'datum DESC', :page =&gt; params[:page], :per_page =&gt; 10)</pre>
<p>Tak a to je v controlleru vše a teď už jen potřebujeme vypsat články a taky naše stránkování.</p>
<pre class="brush: ruby;">- &lt;ul&gt;
-   &lt;% @clanky.each do |clanek| %&gt;
-     &lt;li&gt;&lt;%= clanek.titulek %&gt;&lt;/li&gt;
-   &lt;% end %&gt;
- &lt;/ul&gt;

- &lt;%= will_paginate(@clanky) %&gt;</pre>
<p>Stačí když zavoláme funkci will_paginate s naší proměnou a máme pěkně nastránkováno. :)</p>
<p><span style="color: #ff6600;">ÚPRAVY:</span></p>
<p>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 &#8220;config/enviroment.rb&#8221; přidáme následující řádky a po restartu by mělo být tak jak má :)</p>
<pre class="brush: ruby;">require 'will_paginate'
WillPaginate::ViewHelpers.pagination_options[:previous_label] = 'Novější'
WillPaginate::ViewHelpers.pagination_options[:next_label] = 'Starší'</pre>
<p>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ě.</p>
<pre class="brush: ruby;">@clanky = Post.paginate( ..... , :previous_label =&gt; 'Předchozí', :next_label =&gt; 'Další')</pre>
<p>Pokud budete chtít smazat číslování, tak úprava je taktéž jednoduchá, přidáme jen :page_links a nastavíme jej na false.</p>
<p>Na závěr snad už jen doplním, že ve složce examples (link: <a href="http://github.com/mislav/will_paginate/blob/master/examples/index.html">http://github.com/mislav/will_paginate/blob/master/examples/index.html</a>) se můžete podívat na nějaké CSS styly, tak to jen tak, kdyby se někomu nelíbilo standardní stylování.</p>
<p>V <a title="Stránkování pomocí AJAXu" href="http://petrbobek.cz/clanky/strankovani-v-ruby-on-rails-will_paginate-ajax/">dalším pokračování</a> si ukážeme stránkování pomocí AJAXu.</p>
<p>Nějaké dotazy, poznámky nebo připomínky?</p>
<p>Petr</p>
]]></content:encoded>
			<wfw:commentRss>http://petrbobek.cz/clanky/strankovani-v-ruby-on-rails-will_paginate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Filtrování citlivých dat z logu</title>
		<link>http://petrbobek.cz/clanky/filtrovani-citlivych-dat-z-logu/</link>
		<comments>http://petrbobek.cz/clanky/filtrovani-citlivych-dat-z-logu/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 13:58:35 +0000</pubDate>
		<dc:creator>petrb</dc:creator>
				<category><![CDATA[Bezpečnost]]></category>
		<category><![CDATA[filtrování]]></category>
		<category><![CDATA[log]]></category>

		<guid isPermaLink="false">http://petrbobek.cz/?p=78</guid>
		<description><![CDATA[Všimli jste si, že se do log souborů ukládají i citlivá data? Je velice jednoduché tyto citlivá data filtrovat.]]></description>
			<content:encoded><![CDATA[<p>Vkládají uživatelé na Vašich stránkách citlivá data? Můžou to být hesla, čísla kreditních karet, atp. Pokud se např. uživatel loguje do systému, všechny jeho vložená data jsou uložena v log souboru, kde se uloží i např. hesla.</p>
<p>Tím, že do &#8220;controllers/application.rb&#8221; vložíte následující řádek:</p>
<pre class="brush: ruby;">filter_parameter_logging :heslo
=&gt; tímto se heslo v log souboru nahradí za tento řetězec &quot;[FILTERED]&quot;</pre>
<p>A to je vše. Velice jednoduchá a elegantní možnost jak citlivá data z log souborů filtrovat.</p>
]]></content:encoded>
			<wfw:commentRss>http://petrbobek.cz/clanky/filtrovani-citlivych-dat-z-logu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hrajeme si s CACHE v Ruby on Rails</title>
		<link>http://petrbobek.cz/clanky/hrajeme-si-s-cache-v-ruby-on-rails/</link>
		<comments>http://petrbobek.cz/clanky/hrajeme-si-s-cache-v-ruby-on-rails/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 21:04:51 +0000</pubDate>
		<dc:creator>petrb</dc:creator>
				<category><![CDATA[Optimalizace]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cache sweeper]]></category>
		<category><![CDATA[page cache]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://petrbobek.cz/?p=1</guid>
		<description><![CDATA[V tomto dílu se dozvíte jak se pracuje s keší. Jak a při jakých příležitostech ji efektivně využívat. PAGE CACHING, ACTION CACHING, FRAGMENT CACHING]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: #ff6600;">CO JE TO CACHE (keš)?</span></strong></p>
<p>Keš jako takovou si můžeme představit jako složku se <span style="text-decoration: underline;">statickými html soubory</span>, které byly po prvním načtení stránek vygenerovány. Jakmile někdo druhý bude chtít zobrazit stejnou stránku, tak už nebudou posílány dotazy na server, ale stránka bude <span style="text-decoration: underline;">vytažena z  keše</span>. Tím se zaprvé <span style="text-decoration: underline;">sníží vytížení serveru</span> a za druhé načtení stránky bude taky nesrovnatelně <span style="text-decoration: underline;">rychlejší</span>. Soubory jsou ukládány do <span style="text-decoration: underline;">tmp</span> složky ve vaší aplikaci.</p>
<p><strong><span style="color: #ff6600;">KONFIGURACE</span></strong></p>
<p>Proto aby jste si mohli začít hrát s keší, není potřeba vůbec nic složitého. Je potřeba, nastavit v <span style="line-height: 18px; font-size: 12px; white-space: pre;"><span style="color: #3366ff;">config/environments/development.rb</span></span></p>
<pre class="brush: ruby;">config.action_controller.perform_caching = true</pre>
<p>Defaultně je tato možnost nastavena na false, protože při vývoji aplikace se tato možnost nepokládá za prospěšnou. :) V production módu není nic potřeba nastavovat, je to tam již nastaveno.</p>
<p><strong><span style="color: #ff6600;">POTŘEBUJI CACHE?</span></strong></p>
<p>Používání keše se doporučuje všude tam kde je to jen možné v co možná největší míře. Níže uvádím příklady kdy je kešování vhodné.</p>
<ul>
<li>stránky se nemění (resp. jsou pro všechny uživ. stejné)</li>
<li>stránky jsou dostupné pro veřejnost (není potřeba autentifikace)</li>
</ul>
<p>Druhá podmínka je podstatná, ale i ta se dá obejít použití javascriptu, ale na druhou stranu se zase snižuje přístupnost webu, protože přihlášení uživ. je podmíněno zaplým javascriptem. V tomto článku se ale tomuto tématu věnovat nebudeme. (Někdy přístě můžeme nakousnout i toto téma)</p>
<p><span style="color: #ff6600;"><strong>PAGE CACHE</strong></span></p>
<p>Představme si, že vytváříme jednoduchou aplikaci (např. knihovna). Úvodní stránka může vypadat nějak následovně.</p>
<pre class="brush: ruby;">- class BooksController &lt; ApplicationController
-    def index
-        @knihy = Book.find(:all, :order =&gt; &quot;created_at DESC&quot;, :limit =&gt; 10)
-    end
- end</pre>
<p>Na indexové stránce se nám vybere 10 nejaktuálnějších knih. Pokud budeme chtít trošku věci urychlit, tak můžeme použít page kešing. Na začátek controlleru jen specifikujeme, který action blok budeme chtít kešovat, pomocí direktivy &#8220;caches_page&#8221;.</p>
<pre class="brush: ruby;">- class BooksController &lt; ApplicationController
-    caches_page :index
-    def index
-        @knihy = Book.find(:all, :order =&gt; &quot;created_at DESC&quot;, :limit =&gt; 10)
-    end
- end</pre>
<p>Tak a teď se nám podařilo zdárně zakešovat indexovou stránku. Další krok, který bude následovat je smazání vytvořené keše (resp. zrušíme platnost keše). Keš budeme chtít smazat když přidáme např. nový článek, nebo když stávající editujeme. Kdyby jsme keš nesmazali, tak by se nám změny na úvodní stránce neprojevily a stále by se nám načítal starý zakešovaný obsah.</p>
<pre class="brush: ruby;">- expire_page(:controller =&gt; ‘books’, :action =&gt; ‘index’)</pre>
<p>Problém může nastat, pokud bysme zakešovali specifickou stránku např. &#8220;/books/show/15&#8243; a pak chtěli zrušit tuto keš. Řešením je použití :id, kde specifikujeme o jaký článek se bude jednat. :)</p>
<pre class="brush: ruby;">- expire_page(:controller =&gt; ‘books’, :action =&gt; ‘show’, :id =&gt; 15)</pre>
<p>Další možností jak vymazat cache je použití tzv. sweeper-ů. Použití je taktéž velmi intuitivní a jednoduché. Nesmíme však opomenout daný sweeper v controlleru specifikovat.</p>
<pre class="brush: ruby;">- class BooksController &lt; ApplicationController
-    caches_page :index
-    #sweeper budeme aplikovat jen na následující metody
-    cache_sweeper :book_sweeper, :only =&gt; [:create, :update, :destroy]

-    def index
-        @knihy = Book.find(:all, :order =&gt; &quot;created_at DESC&quot;)
-    end
- end</pre>
<p>vytvoříme book_sweeper.rb, který umístíme do naší &#8220;/model&#8221; složky.</p>
<pre class="brush: ruby;">- class BookSweeper &lt; ActionController::Caching:Sweeper
-    #zde definujeme, který model chceme pozorovat
-    observe Book

-    def after_create(record)
-        expire_page(:controller =&gt; &quot;books&quot;, :action =&gt; &quot;show&quot;, :id =&gt; &quot;15&quot;)
-    end
-    def after_update(record)
-        ...
-    end
-    def after_destroy(record)
-        ...
-    end
- end</pre>
<p>V další části se podíváme na action cache a fragment cache. ;)<br />
Dotazy, poznámky, připomínky jsou vítány.</p>
<p>Petr Bobek</p>
]]></content:encoded>
			<wfw:commentRss>http://petrbobek.cz/clanky/hrajeme-si-s-cache-v-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
