<?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>1up4Developers &#187; rails</title>
	<atom:link href="http://1up4dev.org/category/rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://1up4dev.org</link>
	<description>Nadando contra o Waterfall. tail -f /mind/realworld &#62;&#62; /blog</description>
	<lastBuildDate>Thu, 29 Jul 2010 04:27:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Gerando rotas com parâmetros dinâmicos no Rails de modo fácil</title>
		<link>http://1up4dev.org/2010/07/gerando-rotas-com-parametros-dinamicos-no-rails-de-modo-facil/</link>
		<comments>http://1up4dev.org/2010/07/gerando-rotas-com-parametros-dinamicos-no-rails-de-modo-facil/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 09:00:23 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=680</guid>
		<description><![CDATA[A API de rotas do Rails simplifica consideravelmente o desenvolvimento fornecendo um padrão de geração e utilização de URLs para toda aplicação. Porém algumas necessidades especificas e relativamente simples podem gerar dores de cabeça se forem implementadas incorretamente.
Um caso bastante comum são URLs compostas que sempre apontam para um mesmo recurso. Por exemplo, um blog que [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://api.rubyonrails.org/classes/ActionController/Routing.html">API de rotas</a> do Rails simplifica consideravelmente o desenvolvimento fornecendo um padrão de geração e utilização de URLs para toda aplicação. Porém algumas necessidades especificas e relativamente simples podem gerar dores de cabeça se forem implementadas incorretamente.</p>
<p>Um caso bastante comum são URLs compostas que sempre apontam para um mesmo recurso. Por exemplo, um blog que possua rotas para seus posts no formato <code>/posts/autor/categoria/permalink</code> provavelmente terá uma rota mapeada como <code>map.post "posts/:author/:category/:permalink"</code> gerando automaticamente os helpers <code>post_path</code> e <code>post_url</code>.</p>
<p>Muito bom, porém para <a href="http://guides.rubyonrails.org/routing.html#generating-urls-from-code">usufruirmos desta facilidade</a> precisamos fornecer os valores dos parâmetros dinâmicos nos <em>controllers</em> e <em>views</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">post_path<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:author</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">author</span>, <span style="color:#ff3333; font-weight:bold;">:category</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">category</span>, <span style="color:#ff3333; font-weight:bold;">:permalink</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">permalink</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>E mesmo que você forneça os <a href="http://guides.rubyonrails.org/routing.html#route-generation-from-arrays">parâmetros em um array</a>, vai dar muito trabalho além de deixar muito código repetido pela aplicação.</p>
<h2>Entendi! Mas como resolvo este problema?</h2>
<p>Para este caso, apenas implementar o método <code><a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001840">to_param</a></code> do model não vai servir. Uma solução seria reescrever o método <code>post_path</code> (que é gerado automaticamente) no respectivo helper (posts_helper.rb):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> post_path<span style="color:#006600; font-weight:bold;">&#40;</span>post, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">super</span><span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:author</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> post.<span style="color:#9900CC;">author</span>, <span style="color:#ff3333; font-weight:bold;">:category</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> post.<span style="color:#9900CC;">category</span>, <span style="color:#ff3333; font-weight:bold;">:permalink</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> post.<span style="color:#9900CC;">permalink</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Outra solução seria sobrescrever o método <code><a href="http://api.rubyonrails.org/classes/ActionController/Base.html#M000467">default_url_options</a></code> no <em>controller</em> para retorna os parâmetros padrões da rota:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> default_url_options<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  options.<span style="color:#9900CC;">merge</span>!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:author</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">author</span>, <span style="color:#ff3333; font-weight:bold;">:category</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">category</span>, <span style="color:#ff3333; font-weight:bold;">:permalink</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">permalink</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">&#93;</span> == <span style="color:#996600;">&quot;show&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>A má notícia é que você terá que fazer isto para todos seus controllers e respectivos models.</p>
<p>A terceira solução (e mais elegante) é padronizar a maneira com que os parâmetros opcionais da rota são obtidos a partir do controller e seu respectivo model. Basta adicionar os seguintes métodos no seu <em>ApplicationController</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> default_url_options<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>model = controller_model<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    dynamic_route_params<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>param<span style="color:#006600; font-weight:bold;">|</span>
      options<span style="color:#006600; font-weight:bold;">&#91;</span>param<span style="color:#006600; font-weight:bold;">&#93;</span> = model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>param<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> model.<span style="color:#9900CC;">respond_to</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>param<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  options
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> controller_model<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  clazz = <span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">singularize</span>.<span style="color:#9900CC;">camelize</span>.<span style="color:#9900CC;">constantize</span> <span style="color:#9966CC; font-weight:bold;">rescue</span> ActiveRecord<span style="color:#006600; font-weight:bold;">&#41;</span>
  options.<span style="color:#CC0066; font-weight:bold;">select</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>key, value<span style="color:#006600; font-weight:bold;">|</span> value.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>clazz<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">second</span>
<span style="color:#9966CC; font-weight:bold;">rescue</span>
  <span style="color:#0000FF; font-weight:bold;">nil</span>
<span style="color:#9966CC; font-weight:bold;">end</span> 
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> dynamic_route_params<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  returning <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>dynamic_params<span style="color:#006600; font-weight:bold;">|</span>
    matched_routes = <span style="color:#6666ff; font-weight:bold;">ActionController::Routing::Routes</span>.<span style="color:#9900CC;">routes</span>.<span style="color:#CC0066; font-weight:bold;">select</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>route<span style="color:#006600; font-weight:bold;">|</span>
      route.<span style="color:#9900CC;">matches_controller_and_action</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">&#93;</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    dynamic_segments = matched_routes.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&amp;</span>:segments<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>segment<span style="color:#006600; font-weight:bold;">|</span>
      dynamic_params <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> segment.<span style="color:#9900CC;">key</span> <span style="color:#9966CC; font-weight:bold;">if</span> segment.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">ActionController::Routing::DynamicSegment</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Assim, os valores defaults dos parâmetros da rota serão obtidos diretamente do model. Caso queiram contribuir, este código está disponível no <a href="http://github.com/1up4dev/random-samples/blob/master/dynamic_route_params/dynamic_route_params.rb">github</a>.</p>
<p><strong>Referências</strong><br />
<a href="http://railsguts.com/routing_inside_out.html">Rails Routing from the Inside Out</a><br />
<a href="http://guides.rubyonrails.org/routing.html">Rails Guides: Routing</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2010/07/gerando-rotas-com-parametros-dinamicos-no-rails-de-modo-facil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Active Record em: Como adicionar comportamento as suas associações</title>
		<link>http://1up4dev.org/2010/05/active-record-em-como-adicionar-comportamento-as-suas-associacoes/</link>
		<comments>http://1up4dev.org/2010/05/active-record-em-como-adicionar-comportamento-as-suas-associacoes/#comments</comments>
		<pubDate>Wed, 19 May 2010 13:14:18 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[active record]]></category>
		<category><![CDATA[pragmatismo]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=657</guid>
		<description><![CDATA[Qualquer um que comece a desenvolver com Active Record (AR), minha primeira recomendação é, para tudo e leia:  A Guide to Active Record Associations ou O Guia de Associações do Active Record. O guia é bem completo, e descreve muito bem os tipos de associações que estão disponíveis no AR.
Association Proxy, #wtf !
As associações:

belongs_to
has_one
has_many
has_and_belongs_to_many

Quando usadas, [...]]]></description>
			<content:encoded><![CDATA[<p>Qualquer um que comece a desenvolver com <a href="http://api.rubyonrails.org/files/vendor/rails/activerecord/README.html">Active Record</a> (AR), minha primeira recomendação é, para tudo e leia:  <a href="http://guides.rubyonrails.org/association_basics.html">A Guide to Active Record Associations</a> ou <a href="http://guias.rubyonrails.pro.br/association_basics.html">O Guia de Associações do Active Record</a>. O guia é bem completo, e descreve muito bem os tipos de associações que estão disponíveis no AR.</p>
<h2>Association Proxy, #wtf !</h2>
<p>As associações:</p>
<ul>
<li>belongs_to</li>
<li>has_one</li>
<li>has_many</li>
<li>has_and_belongs_to_many</li>
</ul>
<p>Quando usadas, adicionam alguns métodos (veja <a href="http://guides.rubyonrails.org/association_basics.html#detailed-association-reference">Detailed Association Reference</a>). Por exemplo, ao declarar uma associação <em>belongs_to</em>, o model &#8220;ganhará&#8221; os seguintes métodos:</p>
<ul>
<li>association(force_reload = false)</li>
<li>association=(associate)</li>
<li>build_association(attributes = {})</li>
<li>create_association(attributes = {})</li>
</ul>
<p>Onde association, será substituído pelo nome da associação. Exemplo retirado do guides:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Order <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
   belongs_to <span style="color:#ff3333; font-weight:bold;">:customer</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Cada instância de Order, conterá os métodos:</p>
<p><span style="font-size: small;"> </span></p>
<ul>
<li>customer</li>
<li>customer=</li>
<li>build_customer</li>
<li>create_customer</li>
</ul>
<p>O <em>association proxy</em>, é o objeto que faz a ligação do objeto que contém a associação, conhecido como <em>owner</em>, e o objeto associado, conhecido como <em>target</em>.</p>
<h2>Legal e daí !?!</h2>
<p>Graças ao <em>association proxy</em>, ao declarar uma associação, podemos extendê-la e adicionar comportamentos &#8220;customizados&#8221;. No guia, é citado como <a href="http://guides.rubyonrails.org/association_basics.html#association-extensions">Association Extensions</a>. O código de exemplo abaixo, está no github em <a href="http://github.com/rogerleite/random-samples">random-samples</a>.</p>
<p>Para exemplificar, vamos criar um modulo que adiciona o comportamento de uma galeria a qualquer coleção.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> GalleryColletion
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> current=<span style="color:#006600; font-weight:bold;">&#40;</span>curr = <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@current</span>, <span style="color:#0066ff; font-weight:bold;">@index</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> curr.<span style="color:#0000FF; font-weight:bold;">nil</span>?
      <span style="color:#0066ff; font-weight:bold;">@current</span> = collection.<span style="color:#9900CC;">first</span>
      <span style="color:#0066ff; font-weight:bold;">@index</span> = <span style="color:#006666;">0</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      collection.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>item, index<span style="color:#006600; font-weight:bold;">|</span>
        <span style="color:#9966CC; font-weight:bold;">if</span> item.<span style="color:#9900CC;">id</span>.<span style="color:#9900CC;">to_i</span> == curr.<span style="color:#9900CC;">to_i</span>
          <span style="color:#0066ff; font-weight:bold;">@current</span> = item
          <span style="color:#0066ff; font-weight:bold;">@index</span> = index
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#0066ff; font-weight:bold;">@current</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> current
    <span style="color:#0066ff; font-weight:bold;">@current</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> position
    <span style="color:#0066ff; font-weight:bold;">@index</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> previous?
    <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">false</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@index</span>.<span style="color:#0000FF; font-weight:bold;">nil</span>?
    !!<span style="color:#006600; font-weight:bold;">&#40;</span>@index <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#006666;">1</span> <span style="color:#006600; font-weight:bold;">&gt;</span>= <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> previous
    collection<span style="color:#006600; font-weight:bold;">&#91;</span>@index <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> previous?
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#9966CC; font-weight:bold;">next</span>?
    <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">false</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@index</span>.<span style="color:#0000FF; font-weight:bold;">nil</span>?
    !!<span style="color:#006600; font-weight:bold;">&#40;</span>@index <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span> <span style="color:#006600; font-weight:bold;">&lt;</span> collection.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#9966CC; font-weight:bold;">next</span>
    collection<span style="color:#006600; font-weight:bold;">&#91;</span>@index <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#9966CC; font-weight:bold;">next</span>?
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  private
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> collection
    proxy_owner.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>proxy_reflection.<span style="color:#9900CC;">name</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><a href="http://github.com/rogerleite/random-samples/blob/master/association_extend/lib/extensions/gallery_collection.rb">Gallery Collection</a></p>
<p>Note que o modulo está na pasta lib, logo, a pasta tem que ser adicionada no path via config/environment.rb.</p>
<p>Para extender a associação, declare:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Article <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_and_belongs_to_many <span style="color:#ff3333; font-weight:bold;">:images</span>, <span style="color:#ff3333; font-weight:bold;">:extend</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> GalleryColletion
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><a href="http://github.com/rogerleite/random-samples/blob/master/association_extend/app/models/article.rb">Article model</a>, <a href="http://github.com/rogerleite/random-samples/blob/master/association_extend/app/models/image.rb">Image model aqui</a>.</p>
<p>Agora para navegar entre as imagens, você pode usar:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">a = Article.<span style="color:#9900CC;">first</span>
a.<span style="color:#9900CC;">images</span>.<span style="color:#9900CC;">current</span> = <span style="color:#006666;">1</span> <span style="color:#008000; font-style:italic;">#1 e o Image.id que deseja selecionar</span>
a.<span style="color:#9900CC;">images</span>.<span style="color:#9900CC;">current</span>
a.<span style="color:#9900CC;">images</span>.<span style="color:#9900CC;">position</span>
a.<span style="color:#9900CC;">images</span>.<span style="color:#9966CC; font-weight:bold;">next</span>?
a.<span style="color:#9900CC;">images</span>.<span style="color:#9966CC; font-weight:bold;">next</span>
a.<span style="color:#9900CC;">images</span>.<span style="color:#9900CC;">previous</span>?
a.<span style="color:#9900CC;">images</span>.<span style="color:#9900CC;">previous</span></pre></div></div>

<p>Caso esteja com coragem, baixe o projeto e veja rodando.</p>
<p>Dúvidas, sugestões, algum &#8220;case&#8221; de sucesso, comente!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2010/05/active-record-em-como-adicionar-comportamento-as-suas-associacoes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails Summit 2009</title>
		<link>http://1up4dev.org/2009/10/rails-summit-2009/</link>
		<comments>http://1up4dev.org/2009/10/rails-summit-2009/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 13:21:22 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[eventos]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railssummit]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=558</guid>
		<description><![CDATA[Estamos de volta depois de algumas semanas de correria e muito trabalho, o que nos impediu de postar sobre vários assuntos atuais e experiências recentes. Também migramos de empresa. Agora o Roger e eu estamos trabalhando em uma empresa maior, focada em conteúdo digital, desenvolvendo aplicações de grande porte com Ruby e Rails  
O [...]]]></description>
			<content:encoded><![CDATA[<p>Estamos de volta depois de algumas semanas de correria e muito trabalho, o que nos impediu de postar sobre vários assuntos atuais e experiências recentes. Também migramos de empresa. Agora o <a href="http://1up4dev.org/author/rogerbarreto/">Roger</a> e eu estamos trabalhando em uma empresa maior, focada em conteúdo digital, desenvolvendo aplicações de grande porte com Ruby e Rails <img src='http://1up4dev.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h1>O evento</h1>
<p>Se você não soube do <a href="http://www.railssummit.com.br/">Rails Summit 2009</a> ou não sabe nem o que é Rails recomendo que acesse <a href="http://pbskids.org/teletubbies/">este site</a>. Deixando o sarcasmo de lado, a edição 2009 do Rails Summit foi muito boa. As palestras foram excelentes (com algumas poucas exceções). Os coffe-breaks e as <a href="http://github.com/railssummit/morena_opensource/tree/master/RailsSummit2009/">locagirls</a> também!</p>
<p><img class="alignnone size-full wp-image-567" title="Rails Summit 2009 Locaweb" src="http://1up4dev.org/wp-content/uploads/2009/10/4013425175_68b7b78b6f_original.jpg" alt="Rails Summit 2009 Locaweb" width="500" height="333" /></p>
<p>Quem não conseguiu ir este ano pode conferir o que aconteceu e assistir a algumas palestras nos seguintes links:</p>
<p><a href="http://github.com/leonardoborges/railssummit09">http://akitaonrails.com/2009/10/17/rails-summit-2009-retrospectiva</a></p>
<p><a href="http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/">http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/</a></p>
<p><a href="http://andrefaria.com/2009/10/19/rails-summit-gregg-pollack/">http://andrefaria.com/2009/10/19/rails-summit-gregg-pollack/</a></p>
<p><a href="http://marciotrindade.com/2009/10/13/rails-summit-2009-parte-1">http://marciotrindade.com/2009/10/13/rails-summit-2009-parte-1</a></p>
<p><a href="http://marciotrindade.com/2009/10/14/rails-summit-2009-parte-2">http://marciotrindade.com/2009/10/14/rails-summit-2009-parte-2</a></p>
<p><a href="http://marciotrindade.com/2009/10/16/rails-summit-2009-parte-3">http://marciotrindade.com/2009/10/16/rails-summit-2009-parte-3</a></p>
<h1>Rails não escala</h1>
<p>Das palestras técnicas, focadas em Ruby e Rails, destaco a do <a href="http://blog.envylabs.com">Gregg Pollac</a>: On The Edge of Rails Performance, que falou sobre algumas <a href="http://andrefaria.com/2009/10/19/rails-summit-gregg-pollack/">ferramentas e plugins</a> para ajudar a melhorar a performance de aplicações Rails.</p>
<p>O estreiante <a href="http://m.onkey.org/2009/10/18/railssummit-slides">Pratik Naik</a> também deu algumas dicas muito boas para melhoar a performance e falou um bouco sobre suas experiências com Rails.</p>
<p>Para finalizar, o <a href="http://brunomiranda.com/">Bruno Miranda</a> fechou falando sobre sua experiência com o desenvolvimento do <a href="http://br.msn.cyloop.com/">Cyloop</a>, uma rede social de música, mostrando os problemas enfrentados com escalabilidade e as estratégias utilizadas para resolvê-los.</p>
<p>E claro que não podia deixar de falar da excelente palestra do <a href="http://www.slideshare.net/fabiokung/dsls-internas-e-ruby">Fábio Kung</a> sobre metaprogramação com Ruby, apresentando um hands-on, ou seja, &lt;faustao&gt;quem sabe faz ao vivo&lt;/faustao&gt;, para criar uma DSL em Ruby e outras técnicas de magia negra como <a href="http://coderrr.wordpress.com/2008/11/22/super-simple-callbacks-in-ruby/">Callbacks</a>, que pretendo abordar com mais detalhes aqui no blog.</p>
<p>Resumindo, projetar aplicações Rails escaláveis não é uma tarefa trivial e deve ser pensada com muito cuidado. Pretendo explorar mais este assunto nos próximos posts do blog.</p>
<h1>Agilidade a seu favor</h1>
<p>Apesar de ser um evento sobre Rails, um tema predominante foi agile. A <a href="http://andrefaria.com/2009/10/15/rails-summit-2009-chad-fowler/">largada</a> foi dada pelo <a href="http://chadfowler.com/">Chad Fowler</a> que falou sobre a insurgência Ruby on Rails, incentivando o movimento ágil a &#8220;quebrar as regras&#8221;, <a href="http://chadfowler.com/2006/12/27/the-big-rewrite">parar de fazer as coisas que sabemos que estão erradas</a>! Também ressaltou que é preciso ter coragem e atitude para rejeitar os moldes corporativos e lutar contra os <a href="http://akitaonrails.com/2009/03/30/off-topic-net-negative-producing-programmer">trolls</a>, os <a href="http://1up4dev.org/2008/11/os-guardioes-da-cascata/">guardiões da cascata</a>.</p>
<p>O <a href="http://akitaonrails.com/">Akita</a> realmente surpreendeu com sua <a href="http://vimeo.com/7099091">palestra</a> &#8220;Agile, beyond chaos&#8221;. Explicou os princípios do <a href="http://agilemanifesto.org/">manifesto ágil</a> e comprovou cientificamente o &#8220;porque&#8221; agile funciona!</p>
<p>A palestra sobre empreendedorismo do <a href="http://improveit.com.br/empresa/vinicius">Vinícius Teles</a> foi uma verdadeira aula, contando um pouco da sua história, as dificuldades e obstáculos superados até conseguir transformar o <a href="http://beonthe.net/">Be on the Net</a> em realidade. Resumindo: ganhe dinheiro fazendo o que você gosta e ajudando as outras pessoas a ganhar dinheiro!</p>
<p>Finalizando com chave de ouro, o <a href="http://obiefernandez.com/">Obie Fernandez</a> falou sobre a &#8220;arte&#8221; do desenvolvimento de aplicações. Assim como um artista que precisa praticar muito para atingir a excelência, um programador precisa praticar e codificar muito&#8230; &#8220;O que você está esperando? Fuck the enterprise!&#8221;</p>
<p>Resumindo, falou-se muito sobre agilidade usando ruby e rails como uma ferramenta pragmática. As empresas de software sérias já estão usando Ruby. É a <a href="http://1up4dev.org/2009/08/ruby-quando-a-linguagem-de-programacao-faz-diferenca/">linguagem ideal para o modelo ágil</a>.</p>
<h2>Comentários do Roger</h2>
<p>Tomei a liberdade de adicionar uma nota neste post do <a href="http://1up4dev.org/author/rodrigopanachi/">Panachi</a>, pois como participante do <a href="http://1up4dev.org/2008/10/rails-summit-eu-fui/">Rails Summit 2008</a>, resumidamente notei três coisas do evento:</p>
<ul>
<li>A infra estrutura do evento estava muito melhor, mais espaço, mais organização e sem o calor infernal do ano passado. Parabéns para o Akita e o pessoal da Locaweb pelo ótimo trabalho e evento mais uma vez!</li>
<li>Tivemos ótimas palestras técnicas sobre como melhorar a performance de aplicações Ruby!</li>
<li>Em 2008 a grande mensagem foi &#8220;Participe!&#8221;. Ficou bem claro a importância de participar de projetos e contribuir. Este ano, a grande mensagem foi &#8220;<em>Fuck the Enterprise!</em>&#8220;. <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/10/rails-summit-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby: quando a linguagem de programação faz diferença!</title>
		<link>http://1up4dev.org/2009/08/ruby-quando-a-linguagem-de-programacao-faz-diferenca/</link>
		<comments>http://1up4dev.org/2009/08/ruby-quando-a-linguagem-de-programacao-faz-diferenca/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 11:25:58 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[agilidade]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=545</guid>
		<description><![CDATA[Pretendo neste post falar um pouco da minha evolução na programação e como Ruby e Rails agregaram mais conhecimento e me tornaram um melhor desenvolvedor.
A gente se forma na faculdade e de repente estamos trabalhando como programador em alguma empresa de software. A primeira coisa que você vai concluir é que nada a maioria das [...]]]></description>
			<content:encoded><![CDATA[<p>Pretendo neste post falar um pouco da minha evolução na programação e como Ruby e Rails agregaram mais conhecimento e me tornaram um melhor desenvolvedor.</p>
<p>A gente se forma na <a href="http://gc.blog.br/2009/05/18/o-que-eu-acho-sobre-faculdades-de-informatica/" target="_blank">faculdade</a> e de repente estamos trabalhando como programador em alguma empresa de <a href="http://1up4dev.org/2008/10/software-e-sobre-investimento/" target="_blank">software</a>. A primeira coisa que você vai concluir é que <span style="text-decoration: line-through;">nada</span> a maioria das coisas que foram ensinadas na <a href="http://akitaonrails.com/2009/04/17/off-topic-devo-fazer-faculdade" target="_blank">faculdade</a> não se aplicam na vida real. Triste realidade&#8230;</p>
<p>Mas como um bom programador (que você é) logo começará a se questionar e se interessar por novos assuntos, aprender novos conceitos e técnicas de programação, pois você não se sentirá <a href="http://1up4dev.org/2008/06/a-importancia-de-estudar-constantemente/" target="_blank">confortável</a> fazendo as mesmas tarefas repetitivas ou que não sejam otimizadas.</p>
<h2>Orientação a objetos</h2>
<p>Nada de cachorrinhos ou pessoas com ações como andar, comer, etc. No mundo real, seus problemas são faturas, notas fiscais, relatórios, importadores de arquivos, planilhas&#8230; e por aí vai. Seu primeiro desafio será de entender a orientação a objetos de verdade. Mas não se preocupe se isto demorar um pouco pois logo a &#8220;lâmpada&#8221; acenderá e tudo ficará <a href="http://domaindrivendesign.org/" target="_blank">claro como o dia</a>.</p>
<h2>Linguagem e frameworks</h2>
<p>Agora você consegue modelar os objetos da sua aplicação mas se depara com assuntos técnicos que podem ser solucionados prontamente utilizando-se <a href="http://guilher.me/inovacao/frameworks-ageis-para-projetos-de-web20/" target="_blank">frameworks</a> e alguns recursos avançados da linguagem em questão. Logo você estará visitando os sites da documentação do Struts, do Hibernate, do Ant&#8230; e descobrirá que o nome <a href="http://www.apache.org/" target="_blank">Apache</a>, além de tribo indígena, é muito mais do que um servidor Web. Após muitas provas de conceito e algumas noites sem dormir, você será um programador muito produtivo e confiante.</p>
<h2>Análise e documentação</h2>
<p>Parabéns! Aqui você já pode ser considerado um desenvolvedor. Logo seu destaque na equipe será recompensado com mais trabalho <span style="text-decoration: line-through;">de corno</span> desafiador. Nesta fase sua empresa se parece com uma <a href="http://1up4dev.org/2009/04/agilidade-e-a-buzzword-do-momento/" target="_blank">padaria</a>: &#8220;Me vê meio quilo do relatório X&#8221;, &#8220;Faz dois webservices pra viagem!&#8221;, &#8220;Aí, saindo uma fornada de casos de uso&#8230;&#8221;, etc. Logo <a href="http://1up4dev.org/2008/11/os-guardioes-da-cascata/" target="_blank">alguém</a> tem a brilhante <a href="http://1up4dev.org/2008/11/arquiteto-cascateiro/" target="_blank">idéia</a> de &#8220;documentar&#8221; tudo desde uma simples alteração no CSS do sistema até complexos e numerosos <a href="http://blog.fragmental.com.br/2008/07/25/uh-eme-ele/" target="_blank">diagramas</a> e notações daquele novo sistema para integração. No começo a novidade até parece ser uma boa idéia, mas logo você vai <a href="http://1up4dev.org/2009/07/cuidado-com-casos-de-uso/" target="_blank">descobrir</a> que o que realmente importa é <a href="http://1up4dev.org/2008/11/foco-no-problema/" target="_blank">ouvir os problemas dos clientes</a>.</p>
<h2>Testes</h2>
<p>Se você não teve a sorte de ser orientado desde o começo da sua carreira sobre desenvolvimento guiado por testes, você aprende a importância de testes da melhor maneira possível: <a href="http://www.nomedojogo.com/2009/04/06/so-os-imaturos-nao-testam/" target="_blank">tomando na cabeça</a>! Os problemas começam a ficar mais claros. Você fica mais focado na tarefa que está desempenhando e felizmente também cresce profissionalmente com este aprendizado. Você se pergunta como conseguia desenvolver sem testes e por que a linguagem que você <a href="http://gc.blog.br/2008/10/19/java-e-ruim/" target="_blank">utiliza</a> não tem um suporte mais &#8220;nativo&#8221; a testes.</p>
<h2>Metodologia</h2>
<p>No decorrer da sua experiência você tentará desempenhar suas atividades de <a href="http://1up4dev.org/2008/10/a-perpetuacao-da-especie/" target="_blank">várias maneiras</a>. Quando você faz de tudo um pouco acha que o melhor seria fazer apenas uma tarefa específica mas depois descobre que estava enganado. Neste ponto você provavelmente já experimentou pelo menos duas metodologias de desenvolvimento e saberá identificar as vantagens e <a href="http://1up4dev.org/2008/06/guerrilha-agile-parte-1/" target="_blank">desvantagens</a> em cada uma.</p>
<h2>Agilidade</h2>
<p>Felizmente sua <a href="http://1up4dev.org/2009/01/tpw-dicas-para-a-qualidade-do-software/" target="_blank">experiência</a> o guia para um caminho mais <a href="http://1up4dev.org/2008/12/agilidade-cascateira/" target="_blank">ágil</a>. Após aprender e aplicar os mandamentos do <a href="http://agilemanifesto.org/" target="_blank">manifesto ágil</a> e aprimorar seus conceitos e habilidades técnicas, desenvolver aplicações torna-se uma tarefa &#8220;natural&#8221; que você desempenha com fluência independente da linguagem ou tecnologia utilizada. Suas maiores conquistas se resumem em conseguir contornar um problema tecnológico ou limitação da linguagem, negociar o escopo do projeto com o cliente, implementar a maior cobertura de testes possíveis, <a href="http://1up4dev.org/2009/02/tpw-testando-sistemas-legados-automatizando-build/" target="_blank">automatizar</a> processos durante o desenvolvimento, etc.</p>
<p>Neste ponto você começa a se questionar: o que devo fazer agora para <a href="http://akitaonrails.com/2009/07/23/tradu--o-o-que-faz-um-bom-programador" target="_blank">evoluir</a> profissionalmente?</p>
<h2>Ruby!</h2>
<p>Eis que você conhece Ruby e Rails. A linguagem parece estranha a primeira vista mas após algum tempo dedicado e muito estudo você descobre que é uma ferramenta muito poderosa e produtiva, onde você pode &#8220;fluir&#8221; com seu desenvolvimento. Você pensa no que quer fazer e faz! Escreve sua &#8220;feature&#8221;, implementa e roda! Simples e <a href="http://1up4dev.org/2009/04/business-bingo-generator/" target="_blank">divertido</a>!</p>
<p>Ruby e Rails vieram suprir uma necessidade e/ou carência dos desenvolvedores por <a href="http://www.nomedojogo.com/2009/05/06/como-ruby-on-rails-pode-o-tornar-um-programador-pior/" target="_blank">simplicidade</a>. Até seu surgimento, desenvolver aplicações nas linguagens populares do mercado era uma tarefa complicada e trabalhosa. Ruby é uma linguagem poderosa. Rails é simples e muito produtivo. Combinação perfeita!</p>
<p>O que você tá <a href="http://pt.wikipedia.org/wiki/Procrastinar" target="_blank">esperando</a>? <a href="http://why.nomedojogo.com/" target="_blank">Comece</a> agora <a href="http://akitaonrails.com/" target="_blank">mesmo</a> a <a href="http://www.rubyinside.com.br/" target="_blank">estudar</a> <a href="http://www.ruby-lang.org/" target="_blank">Ruby</a> e <a href="http://www.rubyonrails.pro.br/" target="_blank">Rails</a> e seja feliz!</p>
<p>UPDATE: para não causar confusão, alterei o título. Lembre-se: Ruby é linguagem e Rails é framework!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/08/ruby-quando-a-linguagem-de-programacao-faz-diferenca/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Paginação no Rails com will_paginate e Ajax de modo fácil</title>
		<link>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/</link>
		<comments>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 03:30:48 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=503</guid>
		<description><![CDATA[Paginação é um recurso simples e indispensável em qualquer aplicação séria. Em se tratando de Rails, a solução mais popular é a gem WillPaginate que basicamente adiciona o método &#8220;paginate_&#8221; aos models do ActiveRecord e fornece um helper para renderização dos links da paginação nas views.
Instalando a gem:
sudo gem install will_paginate
Para utilizar na aplicação, adicione [...]]]></description>
			<content:encoded><![CDATA[<p>Paginação é um recurso simples e indispensável em qualquer aplicação séria. Em se tratando de Rails, a solução mais popular é a gem <a href="http://github.com/mislav/will_paginate/tree/master" target="_blank">WillPaginate</a> que basicamente adiciona o método &#8220;paginate_&#8221; aos models do ActiveRecord e fornece um helper para renderização dos links da paginação nas views.</p>
<p>Instalando a gem:</p>
<pre>sudo gem install will_paginate</pre>
<p>Para utilizar na aplicação, adicione no final do <code>config/environment.rb</code>:</p>
<pre>require 'will_paginate'</pre>
<p>Altere o controller para utilizar paginação:</p>
<pre>def index
  @posts = Post.paginate :all, :page =&gt; params[:page], :per_page =&gt; 10
end</pre>
<p>E adicione os links da paginação na view:</p>
<pre>&lt;%= will_paginate @posts %&gt;</pre>
<p>Pronto! Ao clicar nos links da paginação o parâmetro &#8220;page&#8221; será incluído automaticamente na requisição.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/07/posts.png"><img class="alignnone size-medium wp-image-509" title="posts" src="http://1up4dev.org/wp-content/uploads/2009/07/posts-300x253.png" alt="" width="300" height="253" /></a></p>
<h2>Legal, mas cadê o &#8220;ajax&#8221;?</h2>
<p>Por padrão o WillPaginate não se preocupa com isso. O próprio desenvolvedor <a href="http://wiki.github.com/mislav/will_paginate/ajax-pagination" target="_blank">recomenda usar javascript</a> para interceptar o &#8220;click&#8221; dos links e renderizar o resultado na mesma página.</p>
<p>Outra alternativa seria estender a classe responsável por renderizar os links da paginação para utilizar requisições com ajax.</p>
<p>Inclua em <code>app/helpers</code> o arquivo <code>ajax_will_paginate.rb</code> com o código:</p>
<pre>class AjaxWillPaginate &lt; WillPaginate::LinkRenderer
  def prepare(collection, options, template)
    @update = options[:update]
    super
  end
  protected
  def page_link(page, text, attributes = {})
    @template.link_to_remote(text, {
      :url     =&gt; url_for(page),
      :method  =&gt; :get,
      :update =&gt; @update
    })
  end
end</pre>
<p>Então adicione no final do arquivo <code>config/environment.rb</code>:</p>
<pre>  WillPaginate::ViewHelpers.pagination_options[:renderer] = 'AjaxWillPaginate'</pre>
<p>E altere a chamada do helper na view para:</p>
<pre>&lt;%= will_paginate @posts, :update =&gt; 'div_principal' %&gt;</pre>
<p>Informe na opção <code>:update</code> o Id de um objeto html que contenha todo o conteúdo da paginação que será substituído nas requisições seguintes.</p>
<p>É importante lembrar que esta solução altera o comportamento de todos os helpers de paginação da aplicação, por isso deve ser utilizada com cautela. <a href="http://www.botvector.net/2008/08/willpaginate-on-ajax.html" target="_blank">Outras</a> <a href="http://weblog.redlinesoftware.com/2008/1/30/willpaginate-and-remote-links" target="_blank">soluções</a> parecidas podem ser encontradas <a href="http://www.google.com.br/search?q=ajax+will+paginate" target="_blank">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>