<?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; ruby</title>
	<atom:link href="http://1up4dev.org/category/ruby/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>
	</channel>
</rss>