<?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; quick tips</title>
	<atom:link href="http://1up4dev.org/category/quick-tips/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>Teste sua aplicação de Linha de Comando com Cucumber!</title>
		<link>http://1up4dev.org/2010/05/teste-sua-aplicacao-de-linha-de-comando-com-cucumber/</link>
		<comments>http://1up4dev.org/2010/05/teste-sua-aplicacao-de-linha-de-comando-com-cucumber/#comments</comments>
		<pubDate>Fri, 14 May 2010 10:00:21 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[projetos]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[linha de comando]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=643</guid>
		<description><![CDATA[É engraçado como tudo é questão de treino e disciplina. Levei um tempo para me acostumar com TDD, Vim e não poderia ser diferente com testes funcionais, sendo mais especifico, Cucumber.
Até o momento, só tinha usado cucumber em projetos web. E quando voltei a desenvolver o rubygems_snapshot, senti falta de algo para testar funcionalmente. Baseado [...]]]></description>
			<content:encoded><![CDATA[<p>É engraçado como tudo é questão de treino e disciplina. Levei um tempo para me acostumar com <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>, <a href="http://www.vim.org/">Vim</a> e não poderia ser diferente com testes funcionais, sendo mais especifico, <a href="http://cukes.info/">Cucumber</a>.</p>
<p>Até o momento, só tinha usado cucumber em projetos web. E quando voltei a desenvolver o <a href="http://github.com/rogerleite/rubygems_snapshot">rubygems_snapshot</a>, senti falta de algo para testar funcionalmente. Baseado no <a href="http://github.com/vertiginous/pik">pik</a>, montei um esquema simples para validar qualquer aplicação de linha de comando.</p>
<h2>Como instalar</h2>
<p>Basicamente, será necessário (fontes via gist):</p>
<ul>
<li>rake para executar o cucumber</li>
<li>env_terminal.rb</li>
<li>terminal_steps.rb</li>
</ul>
<p><script src="http://gist.github.com/400069.js"></script></p>
<p>Dado que você tem cucumber instalado, com o esquema da pasta &#8220;features&#8221;.</p>
<ul>
<li>Copie o cucumber.rake para a raiz.</li>
<li>Copie o env_terminal.rb para a pasta features.</li>
<li>Copie o terminal_steps.rb para a pasta features/step_definitions/terminal_steps.rb.</li>
<li>Edite o  env.rb incluindo (pode ser no começo):</li>
</ul>
<pre>require "env_terminal"</pre>
<ul>
<li>Dentro do Rakefile, pode ser no final mesmo, adicione:</li>
</ul>
<pre>load "cucumber.rake"</pre>
<h2>Como usar</h2>
<p>Todas features:</p>
<pre>rake cucumber</pre>
<p>Features com a tag @wip, também conhecida como Work in Progress.</p>
<pre>rake cucumber:wip</pre>
<h2>Informações Extras</h2>
<p>Caso precise de mais informações, você tem a opção de ver a saída dos comandos, executando a rake assim:</p>
<pre>rake cucumber show_output=true</pre>
<p>ou</p>
<pre>rake cucumber:wip show_output=true</pre>
<p>No caso do snapshot, tive a necessidade de &#8220;modificar&#8221; o comando gem toda vez que era executado, ou melhor, passar um parâmetro para controlar o ambiente. Dentro do env_terminal.rb, existe o método <strong>gsub_command</strong>, nele você pode &#8220;redefinir&#8221; comandos, caso necessite.</p>
<h2><strong>Gostei, quero mais!</strong></h2>
<p>A solução acima, é bem &#8220;caseira&#8221;. Para projetos simples com funcionalidades simples, funciona bem.</p>
<p>Caso queira algo mais robusto, você tem a opção da <a href="http://github.com/aslakhellesoy/aruba">gem Aruba</a>.</p>
<p>Tem este post como introdução:</p>
<p><a href="http://www.themodestrubyist.com/2010/04/22/aruba---cucumber-goodness-for-the-command-line/">Aruba &#8211; Cucumber Goodness for the Command-Line</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2010/05/teste-sua-aplicacao-de-linha-de-comando-com-cucumber/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rubygems Snapshot! Importando/Exportando gems com velocidade!</title>
		<link>http://1up4dev.org/2010/05/rubygems-snapshot-importandoexportando-gems-com-velocidade/</link>
		<comments>http://1up4dev.org/2010/05/rubygems-snapshot-importandoexportando-gems-com-velocidade/#comments</comments>
		<pubDate>Mon, 10 May 2010 13:53:17 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[projetos]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[gems]]></category>
		<category><![CDATA[gems export]]></category>
		<category><![CDATA[gems import]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=637</guid>
		<description><![CDATA[Nova versão do Rubygems_Snapshot no ar!
Fico feliz em dizer que este é o meu primeiro projeto que passou dos dez &#8220;watchers&#8221; !   E que realmente ajudou alguns developers mundo afora.
A primeira versão foi muito focada no uso pessoal, como &#8220;quebra-galho&#8221; mesmo. Resolvi investir algum tempo e praticamente refaze-lá, pois ao usar no dia-a-dia [...]]]></description>
			<content:encoded><![CDATA[<p>Nova versão do <a href="http://github.com/rogerleite/rubygems_snapshot">Rubygems_Snapshot</a> no ar!</p>
<p>Fico feliz em dizer que este é o meu primeiro projeto que passou dos dez &#8220;watchers&#8221; ! <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  E que realmente ajudou alguns developers mundo afora.</p>
<p>A primeira versão foi muito focada no uso pessoal, como &#8220;quebra-galho&#8221; mesmo. Resolvi investir algum tempo e praticamente refaze-lá, pois ao usar no dia-a-dia percebi algumas falhas e dificuldades de uso.</p>
<p>Basicamente, nesta nova versão:</p>
<p>- É possível trabalhar com mais de um formato. Yml e Tar, que é o padrão.</p>
<p>- Ao exportar, os arquivos &#8220;.gem&#8221; serão exportados.</p>
<p>- Ao importar, ocorre praticamente uma instalação &#8220;offlline&#8221;, muito mais rápido e livre de problemas com &#8220;sources&#8221; do rubygem !</p>
<p>- Usar o Snapshot como API !</p>
<p>Como tive um trabalhão para deixar o Readme legal, não pretendo escrever mais que isso! <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><a href="http://github.com/nofxx">Marcos</a>, valeu pelo incentivo! Cara, forka lá e manda bala!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2010/05/rubygems-snapshot-importandoexportando-gems-com-velocidade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Importando e exportando suas gems com Rubygems Snapshot</title>
		<link>http://1up4dev.org/2009/12/importando-e-exportando-suas-gems-com-rubygems-snapshot/</link>
		<comments>http://1up4dev.org/2009/12/importando-e-exportando-suas-gems-com-rubygems-snapshot/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 16:24:09 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[projetos]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=618</guid>
		<description><![CDATA[Final de ano está rendendo.
O rubygems_snapshot nasceu da necessidade de &#8220;migrar&#8221; as gems instaladas de uma máquina para outra, aliado ao rvm (veja este post-guia-rápido), permite mudar e/ou criar diferentes ambientes em minutos. Assim você pode fugir do famoso &#8220;gem hell&#8221;.
Veja como é difícil usar:
Instalação:
sudo gem install rubygems_snapshot
Para exportar as gems instaladas:
gem snapshot export projeto-exemplo.yml
Supondo [...]]]></description>
			<content:encoded><![CDATA[<p>Final de ano está rendendo.<br />
O <a href="http://github.com/rogerleite/rubygems_snapshot">rubygems_snapshot</a> nasceu da necessidade de &#8220;migrar&#8221; as gems instaladas de uma máquina para outra, aliado ao <a href="http://rvm.beginrescueend.com/">rvm</a> (veja este <a href="http://www.nuxlli.com.br/2009/11/24/para-tudo-instale-o-rvm-antes/">post-guia-rápido</a>), permite mudar e/ou criar diferentes ambientes em minutos. Assim você pode fugir do <span style="text-decoration: line-through;">famoso</span> &#8220;gem hell&#8221;.</p>
<p>Veja como é difícil usar:</p>
<p>Instalação:</p>
<pre>sudo gem install rubygems_snapshot</pre>
<p>Para <strong>exportar</strong> as gems instaladas:</p>
<pre>gem snapshot export projeto-exemplo.yml</pre>
<p>Supondo que esteja em outra máquina, para <strong>importar</strong> as gems, use:</p>
<pre>[sudo] gem snapshot import projeto-exemplo.yml</pre>
<h2>Afinal, o que tem de legal nisso?</h2>
<p>Vamos supor que você acaba de entrar numa nova equipe e tem que montar o ambiente de desenvolvimento (por sinal, um ambiente complicado de configurar). O gem snapshot aliada ao rvm, foi feito para facilitar isto, vamos a um exemplo rápido:</p>
<p>Com o rvm, você pode criar um &#8220;novo ambiente&#8221;:</p>
<pre>rvm use 1.8.7%projeto_exemplo</pre>
<pre>gem list</pre>
<p>Deve retornar vazio.</p>
<pre>gem install rubygems_snapshot</pre>
<pre>gem snapshot import projeto-exemplo.yml</pre>
<p>Instalará as gems necessárias para o projeto e pronto!</p>
<h2>ToDo:</h2>
<p>Esta é uma versão bem básica, onde o &#8220;import&#8221; somente lê as gem e version e manda instalar sem requerir dependências. Está previsto de colocar um aviso no final das gems que deram erro, geralmente devido a dependências de &#8220;build nativos&#8221;, mas por enquanto estamos usando aqui na equipe com sucesso.</p>
<h2>Como faço para criar um rubygems plugin também?</h2>
<p>Bom, logo de cara posso te garantir que não é difícil (apesar da pouca documentação na internet), mas deixarei os detalhes para um outro post. Por enquanto, a minha recomendação é: clone o projeto, analise os dois rb do projeto <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  e crie o seu!</p>
<p>Caso algum corajoso for usar, estou a disposição para ajudar, é só deixar um comentário aê!<br />
Valeu e sucesso!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/12/importando-e-exportando-suas-gems-com-rubygems-snapshot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby, Rubygems e $LOAD_PATH ou Como funciona o require de gems</title>
		<link>http://1up4dev.org/2009/12/ruby-rubygems-e-load_path-ou-como-funciona-o-require-de-gems/</link>
		<comments>http://1up4dev.org/2009/12/ruby-rubygems-e-load_path-ou-como-funciona-o-require-de-gems/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 10:30:15 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[load_path]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=589</guid>
		<description><![CDATA[Na madrugada passada, andei &#8220;brincando&#8221; com o fonte do Rubygems. Logo de cara posso te dizer que não consegui fazer o que queria, e pra amenizar o sentimento de &#8220;perda de tempo&#8221;, resolvi postar alguns truques aprendidos.
Baixei o fonte do rubygems, como faço pra rodá-lo sem alterar o meu sistema?
Foi a primeira pergunta que fiz. [...]]]></description>
			<content:encoded><![CDATA[<p>Na madrugada passada, andei &#8220;brincando&#8221; com o fonte do <a href="http://rubyforge.org/projects/rubygems/">Rubygems</a>. Logo de cara posso te dizer que não consegui fazer o que queria, e pra amenizar o sentimento de &#8220;perda de tempo&#8221;, resolvi postar alguns truques aprendidos.</p>
<h2>Baixei o fonte do rubygems, como faço pra rodá-lo sem alterar o meu sistema?</h2>
<p>Foi a primeira pergunta que fiz. Percebi que com o google não iria encontrar a resposta, mas consegui uma dica importante: $LOAD_PATH.</p>
<pre>$ irb</pre>
<pre>irb(main):001:0&gt; $LOAD_PATH</pre>
<p>No meu Ubuntu, obtive:</p>
<pre>["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</pre>
<pre>$ ls /usr/local/lib/site_ruby/1.8/</pre>
<p>Exatamente nesta pasta que se encontra o rubygems.rb. Bingo!<br />
Para rodar o fonte do rubygems, só é necessário adicionar ao $LOAD_PATH a pasta lib do projeto. Dado que estou na raiz do projeto rubygems baixado, execute:</p>
<pre>~/rubygems$ ruby -I $PWD/lib ./bin/gem -v</pre>
<p>O paramêtro -I permite adicionar diretório ao $LOAD_PATH. Simples e prático. Primeiro problema resolvido, comecei a programar.</p>
<h2>Afinal, como funciona o &#8220;require de gems&#8221;?</h2>
<p>Bom, já sabemos que o require &#8220;rubygems&#8221; fuciona pois encontra-se no $LOAD_PATH do ruby, no caso do meu Ubuntu em &#8220;/usr/local/lib/site_ruby/1.8&#8243;.</p>
<p>Basicamente (e muito), o Rubygems faz duas coisas no Kernel do Ruby.</p>
<ul>
<li>Adiciona o metodo Kernel#gem.</li>
<li>Faz um <a href="http://en.wikipedia.org/wiki/Monkey_patch">Monkey Patch</a> no Kernel#require</li>
</ul>
<h3>Kernel#gem</h3>
<p>Permite &#8220;acionar&#8221; uma versão específica de gem. Note que este acionar, traduz-se para, adicionar a lib da gem no $LOAD_PATH. Segue um trecho do comentário do Kernel#gem:</p>
<p style="padding-left: 30px;">##</p>
<p style="padding-left: 30px;"># Use Kernel#gem to activate a specific version of +gem_name+.</p>
<p style="padding-left: 30px;">#</p>
<p style="padding-left: 30px;"># +version_requirements+ is a list of version requirements that the</p>
<p style="padding-left: 30px;"># specified gem must match, most commonly &#8220;= example.version.number&#8221;.  See</p>
<p style="padding-left: 30px;"># Gem::Requirement for how to specify a version requirement.</p>
<p style="padding-left: 30px;">#</p>
<p style="padding-left: 30px;"># If you will be activating the latest version of a gem, there is no need to</p>
<p style="padding-left: 30px;"># call Kernel#gem, Kernel#require will do the right thing for you.</p>
<p style="padding-left: 30px;">#</p>
<p style="padding-left: 30px;"># Kernel#gem returns true if the gem was activated, otherwise false.  If the</p>
<p style="padding-left: 30px;"># gem could not be found, didn&#8217;t match the version requirements, or a</p>
<p style="padding-left: 30px;"># different version was already activated, an exception will be raised.<br />
[...]</p>
<h3>Kernel#require</h3>
<p>No final do rubygems.rb encontramos:</p>
<p>if RUBY_VERSION &lt; &#8216;1.9&#8242; then</p>
<p>require &#8216;rubygems/custom_require&#8217;</p>
<p>end</p>
<p>Não consegui descobrir o que acontece com o ruby 1.9, mas no 1.8, o monkey patch executa os seguintes passos:</p>
<ul>
<li>Chama o &#8220;original&#8221; require;</li>
<li>Em caso de LoadError;
<ul>
<li>Executa o &#8220;Gem.searcher.find(path)&#8221;;</li>
<li>Se <em>true</em>
<ul>
<li>Chama o activate (novamente traduz-se para adiciona a gem no $LOAD_PATH)</li>
<li>Executa o &#8220;original&#8221; require novamente;</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>Exemplos com o IRB</h3>
<p>Para finalizar legal e comprovar tudo isso, fiz alguns testes:</p>
<pre>$ gem list json</pre>
<p style="padding-left: 30px;">*** LOCAL GEMS ***</p>
<p style="padding-left: 30px;">json (1.2.0, 1.1.9)</p>
<p style="padding-left: 30px;">json_pure (1.2.0)</p>
<p style="padding-left: 30px;">
<pre>$ irb</pre>
<pre>irb(main):001:0&gt; $LOAD_PATH</pre>
<p style="padding-left: 30px;">=&gt; ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</p>
<pre>irb(main):004:0&gt; require "json"</pre>
<p style="padding-left: 30px;">LoadError: no such file to load &#8212; json</p>
<p style="padding-left: 30px;">from (irb):4:in `require&#8217;</p>
<p style="padding-left: 30px;">from (irb):4</p>
<p style="padding-left: 30px;">from :0</p>
<pre>irb(main):005:0&gt; gem "json", "= 1.2.0"</pre>
<p style="padding-left: 30px;">NoMethodError: undefined method `gem&#8217; for main:Object</p>
<p style="padding-left: 30px;">from (irb):5<br />
from :0</p>
<p>O require &#8220;json&#8221; por si só, carrega a versão mais atual da gem.</p>
<pre>irb(main):006:0&gt; require "rubygems"</pre>
<p>=&gt; true</p>
<pre>irb(main):007:0&gt; require "json"</pre>
<p>=&gt; true</p>
<pre>irb(main):008:0&gt; JSON::VERSION</pre>
<p>=&gt; &#8220;1.2.0&#8243;</p>
<pre>irb(main):009:0&gt; $LOAD_PATH</pre>
<p>=&gt; ["/usr/lib/ruby/gems/1.8/gems/gemcutter-0.1.8/lib", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/bin", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/ext/json/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/lib", "/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</p>
<pre>irb(main):010:0&gt; quit</pre>
<p>Após o require &#8220;json&#8221;, as pastas foram adicionadas no $LOAD_PATH.</p>
<pre>"/usr/lib/ruby/gems/1.8/gems/json-1.2.0/bin", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/ext/json/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.2.0/lib"</pre>
<p>Agora olhe que <strong>interessante</strong> este <strong>último teste</strong>:</p>
<pre>$ irb

irb(main):001:0&gt; require "rubygems"</pre>
<p>=&gt; true</p>
<pre>irb(main):002:0&gt; $LOAD_PATH</pre>
<p>=&gt; ["/usr/lib/ruby/gems/1.8/gems/gemcutter-0.1.8/lib", "/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</p>
<pre>irb(main):003:0&gt; gem "json", "= 1.1.9"</pre>
<p>=&gt; true</p>
<pre>irb(main):004:0&gt; $LOAD_PATH</pre>
<p>=&gt; ["/usr/lib/ruby/gems/1.8/gems/gemcutter-0.1.8/lib", "/usr/lib/ruby/gems/1.8/gems/json-1.1.9/bin", "/usr/lib/ruby/gems/1.8/gems/json-1.1.9/ext/json/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.1.9/ext", "/usr/lib/ruby/gems/1.8/gems/json-1.1.9/lib", "/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]</p>
<pre>irb(main):005:0&gt; JSON</pre>
<p>NameError: uninitialized constant JSON<br />
from (irb):5</p>
<pre>irb(main):006:0&gt; require "json"</pre>
<p>=&gt; true</p>
<pre>irb(main):007:0&gt; JSON::VERSION</pre>
<p>=&gt; &#8220;1.1.9&#8243;</p>
<pre>irb(main):008:0&gt; quit</pre>
<p>Note que após o gem &#8220;json&#8221;, &#8220;= 1.1.9&#8243; &#8230; a versao 1.1.9 foi adicionada no $LOAD_PATH mas não foi carregada. Ao executar o require &#8220;json&#8221;, como este já estava no $LOAD_PATH, a versão 1.1.9 é usada.</p>
<p>Espero que com estas explicações, você use com mais segurança o rubygems.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/12/ruby-rubygems-e-load_path-ou-como-funciona-o-require-de-gems/feed/</wfw:commentRss>
		<slash:comments>0</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>
		<item>
		<title>Agendando tarefas em aplicações Rails com rufus-scheduler</title>
		<link>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/</link>
		<comments>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/#comments</comments>
		<pubDate>Sun, 31 May 2009 18:33:06 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=501</guid>
		<description><![CDATA[Rufus é um conjunto de gems utilizado para Workflow e BPM. O rufus-scheduler é a gem responsável pelo agendamento e execução de tarefas (jobs). Se você programa em Java e conhece o Quartz não vai ter dificuldade em utilizá-la.
Instalação:
sudo gem install rufus-scheduler
Utilização:
require 'rubygems'
require 'rufus/scheduler'

scheduler = Rufus::Scheduler.start_new

scheduler.every '5m' do
  puts 'Executando a cada 5 minutos'
end

scheduler.schedule [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rufus.rubyforge.org/" target="_blank">Rufus</a> é um conjunto de gems utilizado para <a href="http://pt.wikipedia.org/wiki/Fluxo_de_Trabalho" target="_blank">Workflow</a> e <a href="http://pt.wikipedia.org/wiki/Business_Process_Management" target="_blank">BPM</a>. O <a href="http://rufus.rubyforge.org/rufus-scheduler/" target="_blank">rufus-scheduler</a> é a gem responsável pelo agendamento e execução de tarefas (jobs). Se você programa em Java e conhece o <a href="http://www.opensymphony.com/quartz/wikidocs/QuickStart.html" target="_blank">Quartz</a> não vai ter dificuldade em utilizá-la.</p>
<p>Instalação:</p>
<pre>sudo gem install rufus-scheduler</pre>
<p>Utilização:</p>
<pre>require 'rubygems'
require 'rufus/scheduler'

scheduler = Rufus::Scheduler.start_new

scheduler.every '5m' do
  puts 'Executando a cada 5 minutos'
end

scheduler.schedule '0 18 * * *' do
  puts 'Executando todos os dias as 18h'
end</pre>
<p>Simples assim! Consulte a <a href="http://rufus.rubyforge.org/rufus-scheduler/" target="_blank">documentação</a> oficial ou <a href="http://github.com/jmettraux/rufus-scheduler/tree/master" target="_blank">contribua com o código</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery DataTables, GitHub API e links da semana</title>
		<link>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/</link>
		<comments>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/#comments</comments>
		<pubDate>Mon, 04 May 2009 04:00:27 +0000</pubDate>
		<dc:creator>Equipe 1up4dev</dc:creator>
				<category><![CDATA[novidades da semana]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[jquey]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=477</guid>
		<description><![CDATA[jQuery DataTables
Nós somos fãs de jQuery pela sua simplicidade e poder de extensão através de plugins. Falando nisso, este plugin torna qualquer tabela &#60;table/&#62; em um &#8220;grid&#8221; ordenável, pesquisavel e paginável automagicamente.

Para usar, basta incluir o plugin na página após o jQuery e executar o script:
$(document).ready(function() {
    $("id-tabela").dataTable();
}
No site oficial é possível [...]]]></description>
			<content:encoded><![CDATA[<h2><a href="http://www.datatables.net/" target="_blank">jQuery DataTables</a></h2>
<p>Nós somos fãs de jQuery pela sua simplicidade e poder de extensão através de plugins. Falando nisso, este plugin torna qualquer tabela &lt;table/&gt; em um &#8220;grid&#8221; ordenável, pesquisavel e paginável <em>automagicamente</em>.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/05/datatables.png"><img class="aligncenter size-medium wp-image-490" title="datatables" src="http://1up4dev.org/wp-content/uploads/2009/05/datatables-300x86.png" alt="" width="300" height="86" /></a></p>
<p>Para usar, basta incluir o plugin na página após o jQuery e executar o script:</p>
<pre>$(document).ready(function() {
    $("id-tabela").dataTable();
}</pre>
<p>No <a href="http://www.datatables.net/" target="_blank">site oficial</a> é possível consultar a documentação, exemplos e a <a href="http://www.datatables.net/plug-ins#language" target="_blank">tradução</a> para pt-br.</p>
<h2><a title="github api take two" href="http://github.com/blog/413-github-api-take-two">GitHub API, version 2</a></h2>
<p>Os caras do GitHub não são fracos não&#8230; já faz um tempinho, mas antes tarde do que nunca, anunciaram em seu <a title="GitHub Blog" href="http://github.com/blog">blog</a> a versão 2 do GitHub API. Ela provê acesso à &#8220;Repository, User, Commit, Object and Network&#8221; e futuramente ao Gist também. Como é a primeira release e ainda estão trabalhando nela, o próprio pessoal do Github pede ajuda a &#8220;desbravadores&#8221; e que abram tickets, caso encontrem algo. Documentação você encontra em  <a title="GitHub API Documentation" href="http://develop.github.com">develop.github.com</a>.</p>
<h2>Links da semana</h2>
<p><a href="http://www.desenvolvimentoparaweb.com/usabilidade/8-caracteristicas-de-user-interfaces-ui-de-sucesso/" target="_blank">8 características de User Interfaces (UI) de sucesso</a></p>
<p><a href="http://github.com/ryanb/nifty-generators/tree/master" target="_blank">Nifty Generators para Ruby on Rails</a></p>
<p><a href="http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/" target="_blank">JRuby on Rails no Google App Engine</a></p>
<p><a href="http://www.ajaxianos.com.br/2008/10/grid-com-ordenacao-e-paginacao-animados/" target="_blank">Grid com ordenação e paginação animados</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Guia de Ruby do Why e Autospec-notification</title>
		<link>http://1up4dev.org/2009/04/guia-de-ruby-do-why-autospec-autotest-notification/</link>
		<comments>http://1up4dev.org/2009/04/guia-de-ruby-do-why-autospec-autotest-notification/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 04:00:03 +0000</pubDate>
		<dc:creator>Equipe 1up4dev</dc:creator>
				<category><![CDATA[novidades da semana]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[testes unitários]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=422</guid>
		<description><![CDATA[O comovente guia de Ruby do Why
Este livro é sensacional e demonstra exatamente o espírito do Ruby: papo de programador.

O livro é bem divertido. As tirinhas das raposas são ótimas. Várias pessoas contribuíram com a tradução para pt-br que está disponível no Github.
Leitura obrigatória. Chunky bacon!
Autospec-notification
O Autospec é um script gerado pelo RSpec que utiliza [...]]]></description>
			<content:encoded><![CDATA[<h2>O comovente guia de Ruby do Why</h2>
<p>Este <a href="http://poignantguide.net/ruby/" target="_blank">livro</a> é sensacional e demonstra exatamente o espírito do Ruby: papo de programador.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/04/thefoxes-3.png"><img class="aligncenter size-full wp-image-463" title="thefoxes-3" src="http://1up4dev.org/wp-content/uploads/2009/04/thefoxes-3.png" alt="" width="500" height="145" /></a></p>
<p>O livro é bem divertido. As tirinhas das raposas são ótimas. Várias <a href="http://www.nomedojogo.com/2008/10/28/why%E2%80%99s-poignant-guide-to-ruby-em-portugues/" target="_blank">pessoas</a> <a href="http://akitaonrails.com/2008/5/14/vamos-traduzir-o-why-s-poignant-guide-to-ruby" target="_blank">contribuíram</a> com a tradução para pt-br que está disponível no <a href="http://github.com/carlosbrando/poignant-br/tree/master" target="_blank">Github</a>.</p>
<p><a href="http://why.nomedojogo.com/" target="_blank">Leitura obrigatória</a>. Chunky bacon!</p>
<h2>Autospec-notification</h2>
<p>O <a href="http://www.nateclark.com/articles/2008/09/17/_autotest_-is-now-_autospec_-how-to-set-up-autospec-for-rspec-and-rails-with-zentest" target="_blank">Autospec</a> é um script gerado pelo <a href="http://rspec.info/" target="_blank">RSpec</a> que utiliza o Autotest para rodar os testes automaticamente a cada alteração no código.</p>
<p>Unindo o útil ao agradável, foi criado o <a href="http://www.mouseoverstudio.com/blog/2008/10/10/autospec-autotest-notification-autospec-notification-e-novidades/" target="_blank">Autospec-notification</a>, que exibe as notificações do autospec no desktop.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/04/sucesso.png"><img class="aligncenter size-full wp-image-465" title="sucesso" src="http://1up4dev.org/wp-content/uploads/2009/04/sucesso.png" alt="" width="500" height="173" /></a></p>
<p>Para instalar, comece pela gem ZenTest:</p>
<pre style="padding-left: 30px;">sudo gem install ZenTest</pre>
<p>No linux, instale o Libnotify:</p>
<pre style="padding-left: 30px;">sudo apt-get install libnotify-bin</pre>
<p>Agora instale a gem do autotest-notification:</p>
<pre style="padding-left: 30px;">sudo gem install carlosbrando-autotest-notification --source=http://gems.github.com</pre>
<p>Ative o autotest-notification e rode o autospec no seu projeto:</p>
<pre style="padding-left: 30px;">an-install</pre>
<pre style="padding-left: 30px;">script/autospec</pre>
<p>O código está no <a href="http://github.com/carlosbrando/autotest-notification/tree/master" target="_blank">Github</a>. Escreva seus testes e divirta-se!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/04/guia-de-ruby-do-why-autospec-autotest-notification/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>