<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>FlavioGranero.com</title>
	
	<link>http://flaviogranero.com</link>
	<description />
	<lastBuildDate>Wed, 04 Nov 2009 00:00:00 PST</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain="flaviogranero.com" port="80" path="/?rsscloud=notify" registerProcedure="" protocol="http-post" />
<image>
		<url>http://www.gravatar.com/blavatar/bda59a911146700c31466b84bf03cc96?s=96&amp;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>FlavioGranero.com</title>
		<link>http://flaviogranero.com</link>
	</image>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/flaviogranero" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Links for 2009-11-03 [del.icio.us]</title><link>http://feedproxy.google.com/~r/flaviogranero/~3/xsMguRIa5J4/maltempe</link><pubDate>Wed, 04 Nov 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/maltempe#2009-11-03</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/blog/542-introducing-resque"&gt;Introducing Resque - GitHub&lt;/a&gt;&lt;br/&gt;
A experiência dos desenvolvedores do GitHub com Background jobs em Rails&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/maltempe#2009-11-03</feedburner:origLink></item><item>
		<title>Rails Summit 2009: Estive lá</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/9JDD9dc2KXE/</link>
		<comments>http://flaviogranero.com/2009/10/26/rails-summit-2009-estive-la/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 02:16:56 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[railssummit]]></category>

		<guid isPermaLink="false">http://flaviogranero.com/?p=107</guid>
		<description><![CDATA[
A Viajem
Foi cansativo, mas mais uma vez valeu muito a pena. Desta vez não conseguimos interessados suficientes para organizar uma caravana paranaeense, então nos aventuramos eu e o RicardoK a viajar de Londrina até São Paulo de ônibus. A viajem corria bem, até percebermos que era volta de feriado prolongado e que enfrentaríamos mais de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=107&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h2 id="a_viajem">
<div id="attachment_108" class="wp-caption alignright" style="width: 310px"><img class="size-medium wp-image-108" title="rails_summit_09_entrada" src="http://flavio.files.wordpress.com/2009/10/4026518141_4e2c9f87cf_o.jpg?w=300&#038;h=199" alt="rails_summit_09_entrada" width="300" height="199" /><p class="wp-caption-text">Eu, Ricardo e Chad</p></div>
<p>A Viajem</h2>
<p>Foi cansativo, mas mais uma vez valeu muito a pena. Desta vez não conseguimos interessados suficientes para organizar uma caravana paranaeense, então nos aventuramos eu e o <a href="http://ricardok.com">RicardoK</a> a viajar de Londrina até São Paulo de ônibus. A viajem corria bem, até percebermos que era volta de feriado prolongado e que enfrentaríamos mais de 100km de trânsito lento. Chegamos com mais de 3 horas de atraso, mas ainda assim com muito tempo para descansar antes do evento. Fiquei no mesmo hotel do ano passado, perto do metrô tietê, onde havia combinado de dividir o quarto com o <a href="http://leonardofaria.net">Leonardo Faria</a>, programador de Divinópolis-MG que até então não conhecia pessoalmente.</p>
<h2 id="o_evento">O Evento</h2>
<div id="attachment_110" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-110" title="rails_summit_09_vinicius" src="http://flavio.files.wordpress.com/2009/10/dsc00623.jpg?w=300&#038;h=225" alt="rails_summit_09_vinicius" width="300" height="225" /><p class="wp-caption-text">Eu e Vinicius Teles</p></div>
<p>A RailsSummit 2009 aconteceu nos dias 13 e 14 de outubro, no Centro de Convenções Anhembi. Foi a segunda edição do maior evento sobre o tema na América Latina. Estive presente também na primeira edição, que foi bem organizada e teve um valor especial para mim, pois foi onde <a href="http://flaviogranero.com/2008/11/25/rails-summit-emprego-novo/">consegui meu emprego atual</a>. Devido a isso, já tínhamos uma expectativa muito boa para a edição desse ano, só não acreditava que seria possível um evento melhor que o do ano passado. Mas foi…</p>
<p>Neste ano não só corrigiram alguns poucos problemas que haviam ocorrido, como melhorar a temperatura do auditório B, como também aumentaram o espaço para networking e o espaço do restaurante, melhoraram o acesso à internet e acrescentaram tradução das palestras de português para para inglês. Além disso, como em um bom evento geek, tivemos um espaço com video-games, onde pude derrotar meu padrão no boxe do Wii =).</p>
<p>Quanto às palestras, mais uma vez tivemos temas variados abordados por grandes nomes internacionais e nacionais, que foram de escalabilidade e testes até empreendedorismo. O <a href="http://twitter.com/leozera">Leonardo</a> fez um resumo do <a href="http://leonardofaria.net/2009/10/13/rails-summit-resumo-do-primeiro-dia/">primeiro</a> e do <a href="http://leonardofaria.net/2009/10/14/rails-summit-resumo-do-segundo-dia/">segundo</a> dias. Foram muitas apresentações excelentes, com destaque para <a href="http://twitter.com/greggpollack">Gregg Pollack</a> mostrando várias gems e plugins para ajudar na melhora da performance das aplicações no primeiro dia e para <a href="http://twitter.com/viniciusteles">Vinicius Teles</a>, falando sobre suas experiencias de empreendedorismo com a ImproveIt, e <a href="http://twitter.com/obie">Obie Fernandez</a>, que falou sobre a arte de desenvolver aplicações, já no segundo dia.</p>
<h2 id="encontros">Encontros</h2>
<div id="attachment_109" class="wp-caption alignright" style="width: 310px"><img class="size-medium wp-image-109" title="rails_summit_09" src="http://flavio.files.wordpress.com/2009/10/4027296870_9d2c7902e2_o.jpg?w=300&#038;h=200" alt="rails_summit_09" width="300" height="200" /><p class="wp-caption-text">Jony, Herval, Leozera, Eu e RicardoK</p></div>
<p>Participar de um grande evento como foi o Rails Summit também é uma ótima oportunidade para rever amigos que moram em outras cidades ou estados, e ainda para conhecer aqueles desenvolvedores que você só reconhece o avatar das redes sociais, twitter e IMs. Reencontrei o pessoal do paraná (<a href="http://twitter.com/ozeias">Ozéias</a>, <a href="http://twitter.com/daviscabral">Davis</a>, <a href="http://twitter.com/zegomesjf">Zé Gomes</a>, <a href="http://twitter.com/mauriciozaffari">Maurício</a>) e de outros estados (<a href="http://twitter.com/freireag">Thiago Freire</a>, <a href="http://twitter.com/jonysk">Jony</a>), e também conheci alguns railers pessoalmente pela primeira vez (<a href="http://twitter.com/leozera">Leonardo Faria</a>, <a href="http://twitter.com/herval">Herval</a>, <a href="http://twitter.com/bt1">Roberto Soares</a>, <a href="http://twitter.com/diegorv">Diego</a> e <a href="http://twitter.com/georgeguimaraes">George Guimarães</a>).</p>
<p>Tive a chance de conhecer também alguns participantes do <a href="http://rails-hits.com">rails-hits podcast</a>, como o <a href="http://twitter.com/elomar">Elomar França</a> e o <a href="http://twitter.com/fagiani">Paulo Fagiani</a>, que já estavam promovendo o Oxente Rails 2010, e o <a href="http://twitter.com/viniciusteles">Vinícius Teles</a>, que fez uma das palestras mais motivadoras da conferência.</p>
<p>E ainda, como na edição passado, o <a href="http://twitter.com/rubyrescue">Chad</a> estava presente, desta vez com mais alguns desenvolvedores vindos de Buenos Aires. É sempre bom poder conversar sem usar o skype, que é como fazemos diariamente no trabalho para a Reach.</p>
<h2 id="concluso">Conclusão</h2>
<p>Sem dúvidas, o que fica do evento é um saldo muito positivo. Algumas sugestões que fizemos no ano passado foram implementadas, como o uso do login no crachá do evento. Já as camisetas, para mim acabaram sendo um grande #fail. Deixo aqui os parabéns ao <a href="http://www.akitaonrails.com">Akita</a> e a <a href="http://www.locaweb.com.br">Locaweb</a> pela organização, aos patrocinadores do evento, e aos Railers de todos os cantos do Brasil e alguns de fora dele, que compareceram e fizeram uma conferência ainda melhor que a anterior. A comunidade parece estar crescendo e mais do que isso, está amadurecendo, com cada vez mais profissionais trabalhando e contribuindo com a tecnologia. Volto para a rotina de trabalho com a motivação renovada.</p>
<address>* Algumas fotos do <a href="http://www.flickr.com/photos/locaweb/">flickr da locaweb</a>, veja outras fotos do evento também no <a href="http://www.flickr.com/photos/maltempe/tags/railssummit/">meu flickr</a>.</address>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=107&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2009/10/26/rails-summit-2009-estive-la/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>

		<media:content url="http://flavio.files.wordpress.com/2009/10/4026518141_4e2c9f87cf_o.jpg?w=300" medium="image">
			<media:title type="html">rails_summit_09_entrada</media:title>
		</media:content>

		<media:content url="http://flavio.files.wordpress.com/2009/10/dsc00623.jpg?w=300" medium="image">
			<media:title type="html">rails_summit_09_vinicius</media:title>
		</media:content>

		<media:content url="http://flavio.files.wordpress.com/2009/10/4027296870_9d2c7902e2_o.jpg?w=300" medium="image">
			<media:title type="html">rails_summit_09</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2009/10/26/rails-summit-2009-estive-la/</feedburner:origLink></item>
		<item><title>Links for 2009-10-22 [del.icio.us]</title><link>http://feedproxy.google.com/~r/flaviogranero/~3/Es_YWljm-cA/maltempe</link><pubDate>Fri, 23 Oct 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/maltempe#2009-10-22</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.intridea.com/2009/9/22/tweetstream-ruby-access-to-the-twitter-streaming-api?blog=development"&gt;TweetStream: Ruby Access to the Twitter Streaming API - Intridea Development Blog&lt;/a&gt;&lt;br/&gt;
Apresentando a gem TweetStream, que provê acesso a nova API de Streaming do twitter&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/maltempe#2009-10-22</feedburner:origLink></item><item><title>Links for 2009-10-07 [del.icio.us]</title><link>http://feedproxy.google.com/~r/flaviogranero/~3/rk-4W4jK_9o/maltempe</link><pubDate>Thu, 08 Oct 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/maltempe#2009-10-07</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.smashingmagazine.com/2009/10/05/mastering-css-coding-getting-started/"&gt;Mastering CSS Coding: Getting Started &amp;laquo;  Smashing Magazine&lt;/a&gt;&lt;br/&gt;
Excelentes dicas para iniciantes em css&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/maltempe#2009-10-07</feedburner:origLink></item><item><title>Links for 2009-09-14 [del.icio.us]</title><link>http://feedproxy.google.com/~r/flaviogranero/~3/LX5T8vOYUPk/maltempe</link><pubDate>Tue, 15 Sep 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/maltempe#2009-09-14</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://weare.buildingsky.net/2009/08/25/rubys-metaprogramming-toolbox"&gt;Ruby's Metaprogramming Toolbox&lt;/a&gt;&lt;br/&gt;
artigo muito bom mostrando as ferramentas que ruby provê para metaprogramação&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/maltempe#2009-09-14</feedburner:origLink></item><item><title>Links for 2009-08-18 [del.icio.us]</title><link>http://feedproxy.google.com/~r/flaviogranero/~3/8s9sSb9ch-A/maltempe</link><pubDate>Wed, 19 Aug 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/maltempe#2009-08-18</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.taylorluk.com/articles/2009/08/12/hey-pac-man-sup-subdomains"&gt;Hey, PAC man. Sup, subdomains ! | Taylor.luk @ idn&lt;/a&gt;&lt;br/&gt;
dicas para usar subdominios em uma aplicação rails usando rack e como testar isso localmente&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/maltempe#2009-08-18</feedburner:origLink></item><item><title>Links for 2009-08-06 [del.icio.us]</title><link>http://feedproxy.google.com/~r/flaviogranero/~3/solDlMdOyQs/maltempe</link><pubDate>Fri, 07 Aug 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/maltempe#2009-08-06</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rails-primer.appspot.com/"&gt;Rails Primer for Google App Engine with JRuby&lt;/a&gt;&lt;br/&gt;
passos para iniciar uma aplicação rails para o google app engine&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/maltempe#2009-08-06</feedburner:origLink></item><item><title>Links for 2009-08-05 [del.icio.us]</title><link>http://feedproxy.google.com/~r/flaviogranero/~3/Q6Ag3V_pezc/maltempe</link><pubDate>Thu, 06 Aug 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/maltempe#2009-08-05</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.envylabs.com/2009/08/set-up-your-server-right-part-1/"&gt;Set Up Your Server Right, Part 1 &amp;laquo;  Envy Labs&lt;/a&gt;&lt;br/&gt;
artigo com dicas sobre a configuração do servidor de produção para applicações rails&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/maltempe#2009-08-05</feedburner:origLink></item><item>
		<title>Filter Table: Plugin para geração de filtros para Rails</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/vQwwd7xYRro/</link>
		<comments>http://flaviogranero.com/2009/04/18/filter-table-plugin-para-geracao-de-filtros-para-rails/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 21:08:21 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[plugin]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[admin pages]]></category>
		<category><![CDATA[filter]]></category>

		<guid isPermaLink="false">http://flaviogranero.com/?p=102</guid>
		<description><![CDATA[Filter Table é um plugin para Ruby on Rails que possibilita uma forma simples para filtragem de dados. O plugin adiciona um método ao controller para gerar condições do ActiveRecord baseado nos parâmetros passados na requisição. Além disso, o plugin inclui Helpers para auxiliar a inserção dos links de filtros nas Views.
Instalando:
O código do plugin [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=102&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Filter Table é um plugin para Ruby on Rails que possibilita uma forma simples para filtragem de dados. O plugin adiciona um método ao controller para gerar condições do ActiveRecord baseado nos parâmetros passados na requisição. Além disso, o plugin inclui Helpers para auxiliar a inserção dos links de filtros nas Views.</p>
<h3>Instalando:</h3>
<p>O código do plugin está hospedado no GitHub, para instalá-lo em sua aplicação, execute o comando:</p>
<blockquote><p>script/plugin install git://github.com/flaviogranero/filter_table.git</p></blockquote>
<h3>Usando:</h3>
<p>Para usar o plugin, basta adicionar uma chamada ao método <strong>filter_attributes</strong> no controller desejado, passando os atributos que podem ser usados na construção do filtro. Feito isso, pode-se chamar o método <strong>filter_conditions</strong> na carga de dados do seu modelo. Vejamos um exemplo de uso no controller:</p>
<h4>Controller (cars_controller.rb):</h4>
<pre class="brush: ruby;">
class CarsController &lt; ApplicationController
    filter_attributes :status

    def index
      @cars = Car.paginate :page =&gt; params[:page], :conditions =&gt; filter_conditions
    end
  end
</pre>
<p>Observe que o modelo Car possui um atributo &#8220;status&#8221; do tipo inteiro, que será usado pelo plugin para gerar as condições baseado nos valores passados como parâmetros da requisição. Um exemplo de URL filtrando os carros com status igual a 1 por exemplo, seria: /cars?status=1</p>
<p>Os filtros ainda podem ser combinados. Um exemplo para isso seria uma requisição para mostrar os carros com status igual a 1 OU a 2: /cars?status=1+2</p>
<p>Criar links na sua página de listagem com todas as combinações de filtros pode ser um tanto trabalhoso. Para facilitar isso, o plugin conta com método auxiliar com essa finalidade, chamado <strong>filter_links_for</strong>. Os parâmetros para o método variam de acordo com a necessidade e o tipo do atributo. Vejamos algums exemplos de views.</p>
<h4>View (index.html.erb):</h4>
<pre class="brush: ruby;">
&lt;h1&gt;Cars&lt;/h1&gt;
  &lt;div&gt;
    &lt;h2&gt;Filters&lt;/h2&gt;
    &lt; %= filter_links_for :status, :values =&gt; {'Normal' =&gt; 0, 'Broken' =&gt; 1, 'Running away' =&gt; 2} %&gt;
  &lt;/div&gt;
  &lt;table&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Status&lt;/th&gt;
      &lt;th&gt;Category&lt;/th&gt;
    &lt;/tr&gt;
    &lt; % @cars.each do |car| %&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt; %=h car.name %&gt;&lt;/td&gt;
        &lt;td&gt;&lt; %= car.status %&gt;&lt;/td&gt;
        &lt;td&gt;&lt; %= car.category %&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt; % end %&gt;
  &lt;/table&gt;
</pre>
<p>No exemplo de view acima, temos como parâmetro o atributo status, e um Hash com os captions e valores possíveis na chave :values.</p>
<p>Você pode ainda passar alguns parâmetros opcionais, como o título da lista de links que será gerada, usando a chave :title, e a classe css usada em filtros ativos pela chave :active_class, cujo valor padrão é &#8220;filter_active&#8221;.</p>
<p>O parâmetro :values aceita Hashs, Arrays ou ainda o valor :auto. Neste último caso, os links dos filtros são geradas a partir de uma query no banco de dados por valores distintos do atributo em questão. Para que isso seja possível, é necessário o uso da chave :model associada ao nome do Modelo, como pode ser observado no exemplo abaixo, para o atributo category:</p>
<h4>View (index.html.erb):</h4>
<pre class="brush: ruby;">
&lt;h1&gt;Cars&lt;/h1&gt;
  &lt;div&gt;
    &lt;h2&gt;Filters&lt;/h2&gt;
    &lt; %= filter_links_for :status, :values =&gt; {'Normal' =&gt; 0, 'Broken' =&gt; 1, 'Running away' =&gt; 2} %&gt;
    &lt; %= filter_links_for :category, :values =&gt; :auto, :model =&gt; 'Car' %&gt;
  &lt;/div&gt;
  &lt;table&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Status&lt;/th&gt;
      &lt;th&gt;Category&lt;/th&gt;
    &lt;/tr&gt;
    &lt; % @cars.each do |car| %&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt; %=h car.name %&gt;&lt;/td&gt;
        &lt;td&gt;&lt; %= car.status %&gt;&lt;/td&gt;
        &lt;td&gt;&lt; %= car.category %&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt; % end %&gt;
  &lt;/table&gt;
</pre>
<p>Para cada valor de filtro, é gerado um link para filtragem exclusiva, e outro para adicionar o valor ao filtro atual. Quando um filtro já está aplicado, esse link é substituído por outro, com a função de remover o valor do filtro atual.</p>
<h3>Contribuindo:</h3>
<p>Contribuições com idéias e novas funcionalidades são sempre bem vindas. O plugin possui cobertura por testes unitários, bastando executar &#8220;Rake test&#8221; dentro de sua pasta. Fique ä vontade para clonar o repositório em</p>
<blockquote><p><a href="http://github.com/flaviogranero/filter_table/">http://github.com/flaviogranero/filter_table/</a></p></blockquote>
<h3>Conclusão:</h3>
<p>O uso do plugin <a href="http://github.com/flaviogranero/filter_table/">filter_table</a> torna páginas com grandes listas de dados, principalmente as usadas para administração de sistemas, mais fáceis de navegar e de visualizar.</p>
<p>Criei o plugin para sanar a necessidade por filtros que tinha em páginas administrativas de um sistema em Ruby on Rails, já que as soluções em plugins e gems existentes com a solução são normalmente complexos de configurar e manter, agregam muitas funcionalidades e na maioria das vezes fazem uso de AJAX de forma abusiva.</p>
<p>O <a href="http://github.com/flaviogranero/filter_table/">filter_table</a> destina-se a resolver apenas o problema dos filtros, sem mágica, mantendo o código simples.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/102/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=102&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2009/04/18/filter-table-plugin-para-geracao-de-filtros-para-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2009/04/18/filter-table-plugin-para-geracao-de-filtros-para-rails/</feedburner:origLink></item>
		<item>
		<title>Ilustrações: Camisetas de Carnaval</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/hFe0tE1BEMI/</link>
		<comments>http://flaviogranero.com/2009/03/12/ilustracoes-camisetas-de-carnaval/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 03:02:20 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[ilustração]]></category>
		<category><![CDATA[camiseta]]></category>
		<category><![CDATA[carnaval]]></category>
		<category><![CDATA[estampa]]></category>

		<guid isPermaLink="false">http://flaviogranero.com/?p=96</guid>
		<description><![CDATA[Criar a ilustração da camiseta do bloco de carnaval &#8220;Os Macabros&#8221; tem sido uma tarefa muito legal, apesar de ser apenas uma vez por ano. O bloco surgiu em 1998 e participa do carnaval da minha cidade natal (Kaloré) até hoje. Eu não fiz a primeira ilustração, mas fiz praticamente todas as outras.
Infelizmente, foi apenas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=96&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Criar a ilustração da camiseta do bloco de carnaval &#8220;Os Macabros&#8221; tem sido uma tarefa muito legal, apesar de ser apenas uma vez por ano. O bloco surgiu em 1998 e participa do carnaval da minha cidade natal (<a href="http://pt.wikipedia.org/wiki/Kaloré">Kaloré</a>) até hoje. Eu não fiz a primeira ilustração, mas fiz praticamente todas as outras.</p>
<p>Infelizmente, foi apenas nos últimos anos que passei a ilustrar usando softwares vetoriais. Antes usava apenas a velha combinação de lápis e papel, talvez por isso não tenha mais os desenhos originais, ou eles devem estar perdidos em alguma gaveta.</p>
<p>Fazer esse tipo de desenho é uma ótima oportunidade para exercitar a criatividade e tentar melhorar o traço, já que não tenho reservado tempo para outras ilustrações. Na sequência a seguir, os desenhos da frente e das costas das camisetas, de 2006 até 2009.</p>
<h3>2006</h3>
<p><a title="Macabros_frente_2006, no Flickr" href="http://www.flickr.com/photos/maltempe/3347456447/"><img src="http://farm4.static.flickr.com/3549/3347456447_3d4f7730be_m.jpg" alt="Macabros_frente_2006" width="170" height="240" /></a><a title="Macabros_frente_2006, no Flickr" href="http://www.flickr.com/photos/maltempe/3348291654/"><img src="http://farm4.static.flickr.com/3436/3348291654_a4cc1d8eec_m.jpg" alt="Macabros_frente_2006" width="170" height="240" /></a></p>
<h3>2007</h3>
<p><a title="Macabros_frente_2007, no Flickr" href="http://www.flickr.com/photos/maltempe/3347459079/"><img src="http://farm4.static.flickr.com/3646/3347459079_4b5286bdb6_m.jpg" alt="Macabros_frente_2007" width="170" height="240" /></a><a title="macabros_costas_2007, no Flickr" href="http://www.flickr.com/photos/maltempe/3347457895/"><img src="http://farm4.static.flickr.com/3456/3347457895_b16e3a4192_m.jpg" alt="macabros_costas_2007" width="224" height="240" /></a></p>
<h3>2008</h3>
<p><a title="Macabros08_Frente, no Flickr" href="http://www.flickr.com/photos/maltempe/3348287316/"><img src="http://farm4.static.flickr.com/3442/3348287316_16491d1c26_m.jpg" alt="Macabros08_Frente" width="240" height="169" /></a><a title="Macabros_Costas_2008, no Flickr" href="http://www.flickr.com/photos/maltempe/3347452979/"><img src="http://farm4.static.flickr.com/3648/3347452979_bcb6c475a2_m.jpg" alt="Macabros_Costas_2008" width="173" height="240" /></a></p>
<h3>2009</h3>
<p><a title="macabros_frente_2009, no Flickr" href="http://www.flickr.com/photos/maltempe/3348296120/"><img src="http://farm4.static.flickr.com/3455/3348296120_a117ea9294_m.jpg" alt="macabros_frente_2009" width="240" height="169" /></a><a title="macabros_costas_2009, no Flickr" href="http://www.flickr.com/photos/maltempe/3347459449/"><img src="http://farm4.static.flickr.com/3441/3347459449_bc09a89c2b_m.jpg" alt="macabros_costas_2009" width="195" height="240" /></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/96/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=96&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2009/03/12/ilustracoes-camisetas-de-carnaval/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3549/3347456447_3d4f7730be_m.jpg" medium="image">
			<media:title type="html">Macabros_frente_2006</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3436/3348291654_a4cc1d8eec_m.jpg" medium="image">
			<media:title type="html">Macabros_frente_2006</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3646/3347459079_4b5286bdb6_m.jpg" medium="image">
			<media:title type="html">Macabros_frente_2007</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3456/3347457895_b16e3a4192_m.jpg" medium="image">
			<media:title type="html">macabros_costas_2007</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3442/3348287316_16491d1c26_m.jpg" medium="image">
			<media:title type="html">Macabros08_Frente</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3648/3347452979_bcb6c475a2_m.jpg" medium="image">
			<media:title type="html">Macabros_Costas_2008</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3455/3348296120_a117ea9294_m.jpg" medium="image">
			<media:title type="html">macabros_frente_2009</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3441/3347459449_bc09a89c2b_m.jpg" medium="image">
			<media:title type="html">macabros_costas_2009</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2009/03/12/ilustracoes-camisetas-de-carnaval/</feedburner:origLink></item>
		<item>
		<title>Ruby Gem: Escopo de busca fácil no ActiveRecord</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/g_bfK7HD9Jw/</link>
		<comments>http://flaviogranero.com/2008/12/26/ruby-gem-escopo-de-busca-facil-no-activerecord/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 20:18:40 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[Ruby Gem]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://flaviogranero.com/?p=78</guid>
		<description><![CDATA[Escrevi a algum tempo um post mostrando como usar campos FULL TEXT do MySQL para ter uma sistema de busca simples mas eficiente em suas aplicações Rails. Para quem não precisa de uma busca mais sofisticada, o plugin acts_as_fulltextable quebra o galho. 
Porém, recentemente me deparei com um situação onde precisava de algo ainda mais simples. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=78&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Escrevi a algum tempo um <a href="http://flaviogranero.com/2008/04/25/sistema-de-busca-full-text-no-rails-usando-mysql/">post mostrando como usar campos FULL TEXT do MySQL</a> para ter uma sistema de busca simples mas eficiente em suas aplicações Rails. Para quem não precisa de uma busca mais sofisticada, o plugin acts_as_fulltextable quebra o galho. </p>
<p>Porém, recentemente me deparei com um situação onde precisava de algo ainda mais simples. Para um sistema de administração de conteúdo, a busca devia pesquisar apenas em um Model, e em apenas alguns campos. Portanto criar uma tabela extra no banco de dados, como o acts_as_fulltextable faz, seria um pouco dispendioso. </p>
<p>Uma solução simples seria usar o método <em>Model.find_by_name</em> por exemplo, para buscar um registro pelo campo &#8216;name&#8217;, mas isso traria apenas um registro e sem a possibilidade de buscar por mais de um campo com uma única execução. Outra solução seria a criação de <em>named_scopes</em>, mas seria um tanto trabalhoso filtrar por vários atributos e ainda tratar a entrada de dados.</p>
<p>Foi então que encontrei a gem <a href="http://github.com/wvanbergen/scoped_search/tree/master">scoped_search</a>. Quando instalada, ela adiciona um escopo para buscas em models do Active Record chamada <strong>search_for</strong>, a qual usa cláusulas LIKE da linguagem SQL para efetuar filtros, diretamente no banco de dados.</p>
<h3>Instalação:</h3>
<p>Adicione ao environment.rb de sua aplicação:</p>
<pre class="brush: ruby;">
config.gem 'wvanbergen-scoped_search', 

           :lib =&gt; 'scoped_search', 

           :source =&gt; 'http://gems.github.com'
</pre>
<p>Depois, execute o comando:</p>
<blockquote><p>$ rake gems:install</p></blockquote>
<p> </p>
<h3>Utilização:</h3>
<p>Basta adicionar uma linha no Model desejado, indicando os campos que serão usados na busca:</p>
<pre class="brush: ruby;">
class User &lt; ActiveRecord::Base

  searchable_on :login, :name

end
</pre>
<p>Depois da alteração, a classe passa a contar com o escopo <strong>search_for, que pode ser usado em cascata com outros <em>named_scopes</em>. No exemplo abaixo de uma action &#8220;search&#8221; do controller de usuários, integra-se a busca com a paginação provida pelo <em>will_paginate</em>:</p>
<p><strong> </strong></p>
<p><em><span style="font-style:normal;"> </span><span style="font-style:normal;"> </span>
<pre class="brush: ruby;">
 def search

   @users = User.search_for(params[:q]).paginate(:page =&gt; params[:page])

    respond_to do |format|

     format.html 

     format.xml  { render <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> ml =&gt; @users }

   end

 end
</pre>
<p></em></p>
<p><em></em></p>
<p><em><span style="font-weight:normal;"><span style="font-style:normal;"> Bem tranquilo. Para incrementar um pouco, podemos ainda adicionar campos de associações na busca. Supondo que o usuário tenha um perfil (</span></span><span style="font-weight:normal;"><span style="font-style:normal;">profile</span></span><span style="font-weight:normal;"><span style="font-style:normal;">), podemos adicionar o campo </span></span><span style="font-weight:normal;"><span style="font-style:normal;">description</span></span><span style="font-weight:normal;"><span style="font-style:normal;"> pertencente ao perfil na busca, da seguinte maneira:</span></span></em></p>
<p><em><span style="font-style:normal;"> </span></p>
<pre class="brush: ruby;">
class User &lt; ActiveRecord::Base

  has_one :profile, :dependent =&gt; :destroy

  searchable_on :login, :name, :profile_description

end
</pre>
<p> </p>
<p><span style="font-weight:normal;"><span style="font-style:normal;"> <br />
No MySQL, pode-se ainda utilizar índices FULLTEXT nos campos mais requisitados, para aumentar a performance das buscas.</span></span></p>
<p><strong><span style="font-weight:normal;"> </span></strong></p>
<p><strong><span style="font-weight:normal;"><span style="font-style:normal;">Fonte<span style="font-weight:normal;">: </span></span></span><span style="font-weight:normal;"><span style="font-style:normal;"><span style="font-weight:normal;"><a href="http://techblog.floorplanner.com/2008/07/26/easy-search-with-activerecord/">Easy search with ActiveRecord</a></span></span></span></p>
<p></strong></em></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/78/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=78&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2008/12/26/ruby-gem-escopo-de-busca-facil-no-activerecord/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2008/12/26/ruby-gem-escopo-de-busca-facil-no-activerecord/</feedburner:origLink></item>
		<item>
		<title>Rails Summit: Emprego Novo!</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/oJSfUeKULds/</link>
		<comments>http://flaviogranero.com/2008/11/25/rails-summit-emprego-novo/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 22:29:29 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[Job]]></category>
		<category><![CDATA[railssummit]]></category>

		<guid isPermaLink="false">http://flavio.wordpress.com/?p=72</guid>
		<description><![CDATA[Você pode estar pensando:
Mais um post sobre a Rails Summit? Não está um pouco atrasado não?
Atrasado, pode ser, mas foi porque estava esperando um bom momento para publicá-lo.
Foram 5 anos de desenvolvimento Delphi, onde eu tive o prazer de trabalhar com uma equipe muito competente e inovadora. Os desenvolvedores Delphi são normalmente taxados como &#8220;pregadores [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=72&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Você pode estar pensando:</p>
<blockquote><p>Mais um post sobre a Rails Summit? Não está um pouco atrasado não?</p></blockquote>
<p>Atrasado, pode ser, mas foi porque estava esperando um bom momento para publicá-lo.</p>
<p>Foram 5 anos de desenvolvimento Delphi, onde eu tive o prazer de trabalhar com uma equipe muito competente e inovadora. Os desenvolvedores Delphi são normalmente taxados como &#8220;pregadores de botão&#8221;, por desenvolvedores de outras linguagens. Mas no caso da nossa equipe isso não acontecia. Com foco no desenvolvimento de ferramentas e frameworks, estávamos sempre buscando e aplicando práticas modernas de desenvolvimento e gerenciamento. E foi esse ambiente que me prendeu por esse tempo.</p>
<p>Mas agora chega a hora de novos desafios. Venho usando Ruby on Rails já há mais de 2 anos, apenas em projetos pessoais, desenvolvidos em meu tempo livre. A tecnologia me chamou tanto a atenção que passei a usá-la em aplicações, a escrever textos esporádicos aqui no blog, a participar da comunidade, me preparando para conseguir uma oportunidade de usá-la em tempo integral.</p>
<p><a href="http://www.flickr.com/photos/maltempe/tags/railssummit/"><img class="alignright" title="Com o pessoal da Phusion" src="http://farm4.static.flickr.com/3145/2951383339_0bc76e2b12_m.jpg" alt="" width="240" height="180" /></a></p>
<p>A oportunidade apareceu justamente durante a <a href="http://locaweb.com.br/railssummit/">Rails Summit</a>. Confesso que quando me inscrevi para o evento, eu sabia que essa seria uma ótima chance de conhecer de perto outros desenvolvedores e buscar oportunidades. Muito se falou sobre o evento, foram <a href="http://www.akitaonrails.com/2008/11/12/rails-summit-blogosfera">muitos posts</a>, <a href="http://flickr.com/photos/tags/railssummit/">fotos</a> e <a href="http://search.twitter.com/search?q=railssummit">twitts</a> destacando a qualidade das palestras e da organização, o que é realmente indiscutível e não pretendo ser repetitivo aqui. Mas além de tudo isso, para mim o evento teve essa outra face. Durante um dos intervalos entre as palestras, estava conversando com o pessoal da caravana paranaense e conhecemos <a href="http://rubyrescue.com/">Chad DePue</a>, um americano residente em Buenos Aires que estava participando do evento e a procura de railers para trabalho remoto. Eu, logicamente, me candidatei =D.</p>
<div id="attachment_73" class="wp-caption alignright" style="width: 310px"><a href="http://flavio.files.wordpress.com/2008/11/3022990114_2be03efd38.jpg"><img class="size-medium wp-image-73" title="Chad DePue na Rails Summit" src="http://flavio.files.wordpress.com/2008/11/3022990114_2be03efd38.jpg?w=300&#038;h=168" alt="Chad DePue na Rails Summit" width="300" height="168" /></a><p class="wp-caption-text">Chad DePue na Rails Summit (foto por tapajos)</p></div>
<p>Depois do evento, tivemos algumas conversas e testes e agora posso dizer que sou o mais novo desenvolvedor da <a href="http://reachnetwork.com/">Reach Network</a>, empresa sediada em Seattle, a qual o Chad presta serviços através da sua consultoria, a <a href="http://inakanetworks.com/">Inaka Networks</a>.</p>
<p>Estou muito satisfeito em começar essa nova fase na minha carreira e gostaria de agradecer a toda a comunidade Rails que é muito receptiva e prestativa, especialmente aos <a href="http://groups.google.com/group/pr-on-rails">Railers do paraná</a> que conheci melhor durante o evento e ao <a href="http://www.akitaonrails.com/">Fábio Akita</a>, por organizar um evento de tão alto nível como foi a Rails Summit. Além desses, uma figura importantíssima nesta mudança foi o Ozéias do <a href="http://railsbox.org/">RailsBox</a>, que organizou muito bem a caravana paranaense e me deu várias dicas sobre trabalho remoto, valeu cara! </p>
<p><a href="http://www.flickr.com/photos/maltempe/tags/railssummit/"><img class="aligncenter" title="Caranava Paranaense" src="http://farm4.static.flickr.com/3010/2951409275_3ef89e89f2.jpg" alt="" width="500" height="375" /></a></p>
<p style="text-align:center;">Caravana paranaense (com alguns catarinenses também)</p>
<p>O evento superou as minhas expectativas, mas como sugestão para o próximo, espero que possamos ter avatares nos crachás e camisetas nerds para comprar =D</p>
<p>Valeu galera e até o próximo evento.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/72/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=72&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2008/11/25/rails-summit-emprego-novo/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3145/2951383339_0bc76e2b12_m.jpg" medium="image">
			<media:title type="html">Com o pessoal da Phusion</media:title>
		</media:content>

		<media:content url="http://flavio.files.wordpress.com/2008/11/3022990114_2be03efd38.jpg?w=300" medium="image">
			<media:title type="html">Chad DePue na Rails Summit</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3010/2951409275_3ef89e89f2.jpg" medium="image">
			<media:title type="html">Caranava Paranaense</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2008/11/25/rails-summit-emprego-novo/</feedburner:origLink></item>
		<item>
		<title>SEO on Rails: URLs Amigáveis</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/fcrLoHEvzsU/</link>
		<comments>http://flaviogranero.com/2008/10/09/seo-on-rails-urls-amigaveis/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 03:04:30 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[SEO on Rails]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[friendly]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[urls]]></category>

		<guid isPermaLink="false">http://flavio.wordpress.com/?p=68</guid>
		<description><![CDATA[Deixar as URLs de sua aplicação amigáveis pode fazer uma grande diferença no ranking dos mecanismos de busca. Isso significa fazer com as URLs fiquem mais simples, criando endereços que sejam legíveis e que tragam alguma informação sobre o conteúdo da página.
Vejamos alguns exemplos de URLs complexas:
index.php?section=cine&#38;category=comedy
ou
/cgi-bin/index.cgi?id=6F7YCH&#38;page=6
Quais os problemas de ter URLs complexas?

A complexidade da [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=68&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Deixar as URLs de sua aplicação amigáveis pode fazer uma grande diferença no ranking dos mecanismos de busca. Isso significa fazer com as URLs fiquem mais simples, criando endereços que sejam legíveis e que tragam alguma informação sobre o conteúdo da página.</p>
<p>Vejamos alguns exemplos de URLs complexas:</p>
<blockquote><p>index.php?section=cine&amp;category=comedy</p></blockquote>
<p>ou</p>
<blockquote><p>/cgi-bin/index.cgi?id=6F7YCH&amp;page=6</p></blockquote>
<h4>Quais os problemas de ter URLs complexas?</h4>
<ul>
<li>A complexidade da URL torna o endereço difícil de memorizar</li>
<li>Em alguns casos fica difícil de saber o que você vai encontrar antes de clicar em um link desse tipo</li>
<li>A tecnologia utilizada pelo aplicativo fica exposta</li>
<li>Se a tecnologia utilizada no site tiver que ser alterada (php para ruby, por exemplo), todas as URLs antigas ficarão inválidas</li>
</ul>
<h4>A solução com Rails</h4>
<p>Para quem usa Rails, principalmente da maneira <a href="http://www.brunocarvalho.com/02/06/2007/restful-ruby-on-rails/">Restful</a>, já tem esses problemas minimizados. Basta fazer um scafold e as URLs para as actions já ficam em um formato simples, como no nosso exemplo de locadora abaixo:</p>
<p>Lista de filmes</p>
<blockquote><p>http://locadora.com/filmes</p></blockquote>
<p>Detalhes de um filme com id igual a 12</p>
<blockquote><p>http://locadora.com/filmes/12</p></blockquote>
<p>Novo filme</p>
<blockquote><p>http://locadora.com/filmes/new</p></blockquote>
<p>Edição de um filme com id igual a 12</p>
<blockquote><p>http://locadora.com/filmes/12/edit</p></blockquote>
<p> </p>
<p>Esse é um dos conceitos de <a href="http://pt.wikipedia.org/wiki/REST">REST</a>: a URL deve descrever o recurso disponibilizado. Acha que está bom? Está, mas podemos melhorar ainda mais. Não seria melhor se ao invés de identificadores numéricos, tivéssemos o próprio título do filme na URL? Por exemplo, a página com detalhes do filme teria a endereço:</p>
<blockquote><p>http://locadora.com/filmes/de-volta-para-o-futuro</p></blockquote>
<p>Existem algumas maneiras de fazer isso em um aplicação Rails. Uma bem simples é instalando o plugin <a href="http://github.com/technoweenie/permalink_fu">permalink_fu</a>:</p>
<blockquote><p>$ script/plugin install git://github.com/cyu/permalink_fu </p></blockquote>
<p>Depois de instalado, basta fazer a seguinte chamada nosso Model Filme, para usar o campo título como identificador na URL:</p>
<pre class="brush: ruby;">
  class Filme &lt; ActiveRecord::Base

    has_permalink :titulo

  end
</pre>
<p>Logicamente o campo título terá seus caracteres especiais e espaços removidos para poder ser usado como endereço http.</p>
<p>Essa abordagem só é viável quando o título do filme é único, pois ficaria impossível distinguir entre dois filmes com o mesmo título, já que ambos teriam a mesma URL. Para estes casos, podemos sobrescrever o método <strong>to_params, usando o helper <strong>PermalinkFu.escape</strong> do plugin para remover acentos e espaços do campo que queremos usar na composição do endereço: </p>
<p><strong>
<pre class="brush: ruby;">
class Filme &lt; ActiveRecord::Base

  def to_param

    &quot;#{id}-#{PermalinkFu.escape(titulo)}&quot;

  end

end
</pre>
<p><span style="font-weight:normal;">Assim, teríamos o formato:</p>
<blockquote><p><span style="font-weight:normal;">http://locadora.com/filmes/12-de-volta-para-o-futuro</span></p></blockquote>
<p><span style="font-weight:normal;">Essa solução causa um pequeno efeito colateral, já que o parâmetro recebido pelo controller em </span></strong><strong>params[:id]</strong> <span style="font-weight:normal;">não terá apenas um valor do tipo inteiro, mas sim uma string. Observe o exemplo de método show do controller de filmes: </span></p>
<pre class="brush: ruby;">
class FilmesController &lt; ApplicationController

  def show
   @filmes = Filme.find(params[:id].to_i)

   respond_to do |format|
     format.html # show.rhtml
     format.xml  { render <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> ml =&gt; @filmes.to_xml }
   end

  end
end
</pre>
<p><span style="font-weight:normal;">Note que é necessário uma conversão do paramêtro ID para o tipo inteiro, em <strong>params[:id].to_i</strong>, para que <strong>o find</strong> funcione corretamente.</span></p>
<p><span style="font-weight:normal;">O uso de URLs amigáveis, além de deixar os endereços de sua aplicação mais fáceis de entender e de lembrar, também fazem com que o posicionamento nos buscadores melhore, já que palavras chave pesquisadas passam a aparecer também nos seus links. </span></p>
<p><span style="font-weight:normal;">Leia mais sobre o uso de URLs amigáveis:</span></p>
<p><a href="http://brunotorres.net/urls"><span style="font-weight:normal;">Criando URLs amigáveis em brunotorres.net</span></a></p>
<p><a title="Better Search Engine Friendly URL’s with Ruby on Rails" rel="bookmark" href="http://www.tonyspencer.com/2007/02/04/better-search-engine-friendly-urls-with-ruby-on-rails/"><span style="font-weight:normal;">Better Search Engine Friendly URL’s with Ruby on Rails</span></a></p>
<p><a href="http://www.jroller.com/obie/entry/seo_optimization_of_urls_in"><span style="font-weight:normal;">SEO Optimization of URLs in Rails with to_param</span></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/68/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=68&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2008/10/09/seo-on-rails-urls-amigaveis/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2008/10/09/seo-on-rails-urls-amigaveis/</feedburner:origLink></item>
		<item>
		<title>SEO on Rails: Títulos e Meta-Tags</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/ppQ1tuwYF2o/</link>
		<comments>http://flaviogranero.com/2008/10/06/seo-on-rails-titulos-meta-tags/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 03:10:29 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[SEO on Rails]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[description]]></category>
		<category><![CDATA[keywords]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[title]]></category>

		<guid isPermaLink="false">http://flavio.wordpress.com/?p=66</guid>
		<description><![CDATA[Otimizar um site para que ele seja bem posicionado pelos mecanismos de busca é uma preocupação recorrente a maioria os desenvolvedores web. As chamadas técnicas de SEO já não são segredo e existem muitos bons sites que ensinam como alcançar as primeiras páginas do Google. Logicamente apenas o próprio Google pode garantir uma posição em [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=66&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Otimizar um site para que ele seja bem posicionado pelos mecanismos de busca é uma preocupação recorrente a maioria os desenvolvedores web. As chamadas técnicas de <a href="http://www.marketingdebusca.com.br/seo/">SEO</a> já não são segredo e existem muitos bons sites que ensinam como alcançar as primeiras páginas do Google. Logicamente apenas o próprio Google pode garantir uma posição em seu resultado, mas existem alguns fatores que quando levados em consideração influenciam diretamente esse posicionamento.</p>
<p>Quando criamos um sistema usando Rails, alguns pontos podem passar desapercebidos, devido as convenções usadas pelo framework. Pretendo iniciar uma série de posts mostrando como fazer SEO em aplicações Rails, mostrando alguns métodos e plugins que podem facilitar o nosso trabalho.</p>
<h4>Técnicas de SEO</h4>
<p>Para ter uma introdução sobre o que significa SEO e como são classificadas essas práticas, principalmente pelos mecanismos de busca, eu recomendo a leitura do artigo <a href="http://www.tableless.com.br/white-gray-e-black-hats">White, Gray e Black Hats</a>. Neste post do tableless, Diego Eis mostra exemplos de técnicas White Hat, que são as recomendadas pelos buscadores, as técnicas Gray Hat, que se utilizadas se forma abusiva são consideradas anti-éticas, e ainda das Black Hat, essas sim tomadas como forma de enganar o ranking, e que quando descobertas são punidas com a remoção do site infrator.</p>
<p>As boas práticas recomendadas (White Hat) podem ser resumidas em: criar bom conteúdo e criar links internos. Para os buscadores, um bom conteúdo é um conteúdo relevante, ou seja, um conteúdo que por sua qualidade está sendo linkado por editores de outros sites. Além da qualidade, atualmente os buscadores verificam se esse conteúdo está formatado adequadamente, fazendo uso correto de meta-tags e estrturado de acordo com as definições da W3C. O Google, por exemplo, classifica melhor páginas bem formadas, com tags semanticamente corretas e uma boa hierarquia de títulos. Uma boa dica é sempre utilizar a ferramenta <a href="http://validator.w3.org/">validação de HTML e CSS</a> da W3C e ainda as <a href="http://www.google.com/webmasters/">ferramentas para webmasters</a> disponibilizadas pelo próprio Google, que verificam diversos aspectos que alteram a indexação.</p>
<h3>Títulos e Meta-Tags</h3>
<p>Quem já teve um site indexado sabe da importância dada à tag com o título da página (&lt;title&gt;) e as chamadas meta-tags, com a descrição (&lt;description&gt;) e as palavras chaves (&lt;keywords&gt;), que vão no cabeçalho do HTML. Por isso, é importante que cada página da sua aplicação tenha conteúdos distintos nestas tags, algo que se encaixe com o conteúdo apresentado. Para facilitar esse trabalho, vou apresentar o plugin para Rails chamado <a href="http://github.com/kpumuk/meta-tags">meta-tags</a>.</p>
<p>Se você tem o GIT instalado, vá até a pasta da sua aplicação e execute:</p>
<blockquote><p>$ script/plugin install git://github.com/kpumuk/meta-tags.git</p></blockquote>
<p>Feito isso, você já pode organizar melhor o conteúdo de suas meta-tags. Vejamos como utilizar o plugin em uma aplicação Rails, que para fins de exemplo, chamarei de &#8220;Locadora&#8221;.</p>
<p>No layout da aplicação (normalmente em app/views/layouts/application.html.erb), use o helper <strong>display_meta_tags</strong>, da seguinte maneira:</p>
<pre class="brush: xml;">
  &lt;head&gt;

    &lt; %= display_meta_tags :site =&gt; 'Locadora' %&gt;

  &lt;/head&gt;
</pre>
<p>Este método é responsável por inserir as tags e <strong>title</strong>, <strong>description</strong> e <strong>keywords</strong> no HTML. Depois, podemos configurar valores como o título da página para cada view, usando a seguinte chamada:</p>
<pre class="brush: xml;">
  
&lt;h1&gt;&lt; %= title 'Locações pendentes' %&gt;&lt;/h1&gt;
</pre>
<p>Fazendo isso por exemplo, quando a página acima for mostrada, sua tag title será configurada de acordo com o conteúdo, no formato abaixo:</p>
<pre class="brush: xml;">
  &lt;head&gt;

    &lt;title&gt;Locadora | Locações pendentes&lt;/title&gt;

  &lt;/head&gt;

  &lt;body&gt;

    
&lt;h1&gt;Locações pendentes&lt;/h1&gt;
  &lt;/body&gt;
</pre>
<div>É possível ainda setar o valor das tags diretamente dos controllers, acessando variáveis de instância:</div>
<pre class="brush: ruby;">
@page_title = 'Locações pendentes'
@page_description = 'Lista de locações que ainda não foram devolvidas.'
@page_keywords = 'Locadora, Locações, Pendentes'
</pre>
<p>Ou ainda, usando o método <strong>set_meta_tags</strong>:</p>
<pre class="brush: ruby;">
set_meta_tags :title =&gt; 'Locações pendentes',
                     :description =&gt; 'Lista de locações que ainda não foram devolvidas.',
                     :keywords =&gt; 'Locadora, Locações, Pendentes'
</pre>
<p>Caso você queira, pode ainda usar opções extras para personalizar seus títulos:</p>
<p><strong>:prefix</strong> &#8211; Para não mostrar o nome do site antes por exemplo, ou mostrar outro conteúdo</p>
<p>Ex.: &lt;%= title &#8216;Locações pendentes&#8217;, :prefix =&gt; false %&gt; #&#8211;&gt; &lt;title&gt;Locações pendentes&lt;/title&gt;</p>
<p><strong>:separator</strong> &#8211; Texto usado para separar o nome do site do nome da página.</p>
<p>Ex.: &lt;%= title &#8216;Locações pendentes&#8217;, :separator =&gt; &#8220;:&#8221; %&gt; #&#8211;&gt; &lt;title&gt;Locadora : Locações pendentes&lt;/title&gt;</p>
<p><strong>:reverse</strong> &#8211; Quando verdadeiro, inverte a posição no nome do site e o nome da página.</p>
<p>Ex.: &lt;%= title &#8216;Locações pendentes&#8217;, :reverse =&gt; true %&gt; #&#8211;&gt; &lt;title&gt;Locações pendentes | Locadora&lt;/title&gt;</p>
<p>Outras opções e formas de uso são melhor detalhadas no arquivo <strong>README.rdoc</strong>, que se encontra na pasta do plugin.</p>
<p>O plugin <a href="http://github.com/kpumuk/meta-tags">meta-tags</a> facilita o gerenciamento do conteúdo de tags que são de suma importância para ter um website bem posicionado. Conteúdo esse que fica mais difícil de individualizar para cada view a medida que a aplicação cresce. Uma boa prática para o uso deste plugin é setar valores padrão das tags no controller da aplicação (application.rb) e depois customizar o conteúdo nas views.</p>
<p>Nos próximos posts desta série, teremos mais dicas de plugins para melhorar o SEO das suas aplicações Rails. Aguardem&#8230;</p>
<p>Leia mais sobre SEO:</p>
<ul>
<li><a href="http://www.tableless.com.br/seo">Página sobre SEO no Tableless</a></li>
<li><a href="http://www.marketingdebusca.com.br/seo/">Marketing de Busca</a></li>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=66&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2008/10/06/seo-on-rails-titulos-meta-tags/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2008/10/06/seo-on-rails-titulos-meta-tags/</feedburner:origLink></item>
		<item>
		<title>Ruby Tips: Iterando em Arrays</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/5y_MfcNz2k4/</link>
		<comments>http://flaviogranero.com/2008/08/23/ruby-tips-iterando-em-arrays/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 21:00:09 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[Ruby Tips]]></category>
		<category><![CDATA[ruby tip iteractors array]]></category>

		<guid isPermaLink="false">http://flavio.wordpress.com/?p=45</guid>
		<description><![CDATA[Ruby sempre me atraiu pela facilidade com que posso usar as classes Array e Hash para manter estruturas de dados que em outras linguagens eu teria a necessidade de usar classes especiais, normalmente um classe para cada tipo de elemento, o que sempre deixava o código cheio de typecasts e muitos laços FOR ou WHILE [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=45&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ruby sempre me atraiu pela facilidade com que posso usar as classes Array e Hash para manter estruturas de dados que em outras linguagens eu teria a necessidade de usar classes especiais, normalmente um classe para cada tipo de elemento, o que sempre deixava o código cheio de typecasts e muitos laços FOR ou WHILE para fazer iterações. Diferente de outras linguagens, em Ruby tudo é um objeto, inclusive um Array, que possui métodos que auxiliam na própria iteração com seus elementos. Todos esses métodos de iteração recebem um bloco de código que é executado para cada elemento do Array. Vou mostrar alguns exemplos de uso abaixo, então abra o IRB e vamos testar cada um deles:</p>
<pre class="brush: ruby;">
numbers = [1, 2, 3, 4, 5]
</pre>
<p>Vou usar esse array como padrão para os exemplos.</p>
<h3>Método Each</h3>
<p>O método EACH recebe um bloco de código que será executado para cada elemento do Array. Cada elemento é passado para o bloco como parâmetro durante a iteração. Com isso podemos realizar operação com cada elemento, como por exemplo, imprimir uma frase com cada valor:</p>
<pre class="brush: ruby;">
numbers.each do |number|
puts &quot;Linha de numero #{number}&quot;
end
</pre>
<p>Produzirá:<br />
Linha de numero 1<br />
Linha de numero 2<br />
Linha de numero 3<br />
Linha de numero 4<br />
Linha de numero 5</p>
<h3>Método Select</h3>
<p>O método SELECT recebe um bloco de código que é executado para cada elemento. A diferença com o EACH é que enquanto este não retorna nenhum valor, o SELECT retorna um outro Array. Vamos comparar a utilização dos dois com um exemplo de seleção de números pares:</p>
<pre class="brush: ruby;">
even = []
numbers.each do |number|
even &lt; &lt; number if number %2 == 0
end
</pre>
<p>Adicionamos ao Array even números com o resto da divisão por 2 igual a zero, obtendo [2,4]. Vejamos como o SELECT torna isso ainda mais fácil:</p>
<pre class="brush: ruby;">
even = numbers.select do |number|
number % 2 ==0
end
</pre>
<p>Método Inject<br />
O método INJECT também chama um bloco de código para cada iteração, mas com a diferença de passar 2 parâmetros a esse bloco. O primeiro deles é um acumulador e o segundo é o elemento. Vamos novamente comparar sua utilização com o EACH com um exemplo onde somamos todos os valores do Array numbers, primeiro usando o EACH e depois usando o INJECT:    </p>
<pre class="brush: ruby;">
sum = 0
numbers.each do |number|
sum += number
end

sum = numbers.inject do |a, number|
a + number
end
</pre>
<p>O INJECT pode ainda receber um parâmetro, que é usado como valor inicial para o acumulador. Exemplo:</p>
<pre class="brush: ruby;">
sum = numbers.inject(10) do |a, number|
a + number
end
</pre>
<p>Com o valor inicial sendo 10, sum passaria a ter o valor 25.</p>
<p>Método Map</p>
<p>O método MAP realiza a mesma iteração em um bloco de código como nos métodos anteriores, mas a resposta é um novo Array, com novos elementos baseado em operações aplicadas a cada elemento. Desta vez vamos comparar sua utilização com o EACH criando um Array com os valores de numbers multiplicados por 10. </p>
<pre class="brush: ruby;">
new_numbers = []
numbers.each do |number|
new_numbers &lt; &lt; number * 10
end

new_numbers = numbers.map do |number|
number * 10
end
</pre>
<p>Depois de qualquer uma das chamadas acima, new_numbers será [10,20,30,40,50]. Logicamente o uso do método MAP neste caso é mais limpo e elegante.</p>
<p>Espero que tenha esclarecido a diferença de uso dos iteradores de Array existentes em Ruby. Lembrando que esses mesmos métodos também existem em classes Hash. Tecnicamente a única diferença entre Arrays e Hashs é que na primeira classe os índices dos elementos são números inteiros, enquanto que um Hash por ter qualquer tipo de objeto como índice.</p>
<p>Fonte: <a href="http://railspikes.com/2008/7/29/functional-loops-in-ruby-each-map-inject-select-and-for">RailsSpikes</p>
<p><a href="http://railspikes.com/2008/7/29/functional-loops-in-ruby-each-map-inject-select-and-for"> </a><a href="http://railspikes.com/2008/7/29/functional-loops-in-ruby-each-map-inject-select-and-for"> </a></p>
<p><a href="http://railspikes.com/2008/7/29/functional-loops-in-ruby-each-map-inject-select-and-for"></a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/flavio.wordpress.com/45/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/flavio.wordpress.com/45/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=45&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2008/08/23/ruby-tips-iterando-em-arrays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2008/08/23/ruby-tips-iterando-em-arrays/</feedburner:origLink></item>
		<item>
		<title>Aplicações brasileiras em Rails e conferência Rails em outubro</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/11nsXu-ylf8/</link>
		<comments>http://flaviogranero.com/2008/07/28/aplicacoes-brasileiras-em-rails-e-conferencia-em-outubro/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 18:54:07 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[sismiko]]></category>
		<category><![CDATA[rails brazil conference applications sismiko]]></category>

		<guid isPermaLink="false">http://flavio.wordpress.com/?p=36</guid>
		<description><![CDATA[Todo mundo que já pesquisou um pouco sobre Ruby ou Rails passou a conhecer Fábio Akita. Ele tem trabalhado bastante para tornar o desenvolvimento em Ruby On Rails cada vez mais popular aqui no Brasil. Para quem ainda não conhece (paraquedista com certeza =D), ele é um dos pioneiros a utilizar a tecnologia, escreveu o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=36&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Todo mundo que já pesquisou um pouco sobre Ruby ou Rails passou a conhecer <a href="http://www.akitaonrails.com">Fábio Akita</a>. Ele tem trabalhado bastante para tornar o desenvolvimento em Ruby On Rails cada vez mais popular aqui no Brasil. Para quem ainda não conhece (paraquedista com certeza =D), ele é um dos pioneiros a utilizar a tecnologia, escreveu o primeiro livro em português sobre o assunto e agora está à frente da equipe Rails da Locaweb, para oferecer uma hospedagem de qualidade seguindo o padrão dos hostings internacionais.</p>
<p><a href="http://flavio.files.wordpress.com/2008/07/trains.jpg"><img class="alignright size-medium wp-image-37" src="http://flavio.files.wordpress.com/2008/07/trains.jpg?w=300&#038;h=292" alt="" width="300" height="292" /></a></p>
<p>A fim de divulgar projetos de brasileiros feitos com Rails, ele publicou em seu blog <a title="Brazilian Rails Websites" href="http://www.akitaonrails.com/2008/7/27/brazilian-rails-websites">uma lista de aplicativos</a> que usam o framework e foram criados por brasileiros. Fico muito agradecido por ter um projeto citado entre outros tão importantes e que me serviram como inspiração. O <a title="Sismiko, eventos no Brasil" href="http://www.sismiko.com">Sismiko</a> apareceu entre nomes como <a href="http://blogblogs.com.br/">BlogBlogs</a>, <a href="http://www.treinatom.com.br">TreinaTom</a>, <a href="http://pagestacker.com/">Pagestacker</a>, <a href="http://www.mapia.com.br/">Mapia</a>, <a href="http://www.investidorvirtual.com/">Investidor Virtual</a> e <a href="http://www.ikwa.com.br/">Ikwa</a>, só para citar alguns.</p>
<p>Espero que o <a title="Sismiko, eventos no Brasil" href="http://www.sismiko.com">Sismiko </a>também inspire desenvolvedores recém chegados ao Rails à transformar suas idéias em realidade. Não deixe de conferir <a href="http://www.akitaonrails.com/2008/7/27/brazilian-rails-websites">a lista completa de aplicativos</a> e até sugerir algum que você conheça mas tenha ficado de fora.</p>
<p>Se meus planos se confirmarem, poderei encontrar os desenvolvedores desses aplicativos na <a href="http://www.akitaonrails.com/2008/7/13/rails-summit-latin-america-2008">Rails Summit Latin América</a> que acontece em Outubro, no Anhembi em São Paulo. Se você estava dando uma voltinha por Marte nos últimos dias =D, não deve saber que esta será, com certeza, a maior conferência sobre Rails realizada abaixo da linha do Equador. Nas palavras do próprio Akita:</p>
<blockquote><p>Teremos alguns dos maiores Railers da comunidade internacional como David Hansson, Charles Nutter, Chad Fowler, Dr. Nic, Chris Wanstrath, David Chelinsky e muito mais, em dois dias inteiros, com duas sessões paralelas, incluindo almoço, coffee break por R$ 300 (cerca de USD 190).</p></blockquote>
<p>Além dessas atrações internacionais, teremos palestras de brasileiros empreendedores Rails: <a href="http://blogblogs.com.br/"><strong>Manoel Lemos</strong></a> do <a href="http://www.brasigo.com.br/">Brasigo</a> e <a href="http://blogblogs.com.br/">BlogBlogs</a>, <a href="http://www.treinatom.com.br/"><strong>Carlos Eduardo</strong></a> da <a href="http://www.egenial.com.br/">e-Genial</a> e <a href="http://www.treinatom.com.br">Treina Tom</a>, <a href="http://fabiokung.com/"><strong>Fabio Kung</strong></a> da <a href="http://www.caelum.com.br/">Caelum</a>, <a href="http://www.improveit.com.br/"><strong>Vinicius Teles</strong></a> da <a href="http://www.improveit.com.br/">Improve it</a> (nosso famoso evangelista de XP) e <a href="http://www.pagestacker.com/br/about#george"><strong>George Guimarães</strong></a> do <a href="http://www.pagestacker.com/">Pagestacker</a>.</p>
<p>O site oficial do evento será lançado em breve, com venda de ingressos e dicas de transporte e hospedagem.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/flavio.wordpress.com/36/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/flavio.wordpress.com/36/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=36&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2008/07/28/aplicacoes-brasileiras-em-rails-e-conferencia-em-outubro/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>

		<media:content url="http://flavio.files.wordpress.com/2008/07/trains.jpg?w=300" medium="image" />
	<feedburner:origLink>http://flaviogranero.com/2008/07/28/aplicacoes-brasileiras-em-rails-e-conferencia-em-outubro/</feedburner:origLink></item>
		<item>
		<title>BDD com Shoulda: Menos código, testes mais legíveis</title>
		<link>http://feedproxy.google.com/~r/flaviogranero/~3/bEAZWZyPgb8/</link>
		<comments>http://flaviogranero.com/2008/07/19/bdd-com-shoulda-menos-codigo-testes-mais-legiveis/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 20:48:49 +0000</pubDate>
		<dc:creator>flavio</dc:creator>
				<category><![CDATA[TDD]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[shoulda rails bdd tdd]]></category>

		<guid isPermaLink="false">http://flavio.wordpress.com/?p=28</guid>
		<description><![CDATA[Para quem ainda não conhece, BDD (Behavior Driven Development) é uma prática de processos ágeis que vem mudando a maneira como os desenvolvedores escrevem testes automatizados para seus sistemas.  Testes escritos sobre este conceito são mais fáceis de entender e podem ser utilizados como ferramenta de modelagem de um sistema, já que eles ajudam pessoas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=28&subd=flavio&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Para quem ainda não conhece, <a href="http://en.wikipedia.org/wiki/Behavior_driven_development"><span>BDD</span></a> (Behavior Driven Development) é uma prática de processos ágeis que vem mudando a maneira como os desenvolvedores escrevem testes automatizados para seus sistemas.  Testes escritos sobre este conceito são mais fáceis de entender e podem ser utilizados como ferramenta de modelagem de um sistema, já que eles ajudam pessoas com pouco conhecimento técnico à entender funcionamento do software. Além disso, testes simples de entender também são simples de manter.</p>
<p><span>Essas vantagens me fizeram pensar na idéia de migrar os testes do meu <a title="Sismiko" href="http://www.sismiko.com">projeto Rails</a>, que tinha seus testes unitários escritos sobre o framework Test/Unit, o padrão utilizados pelo Rails para <a title="TDD" href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> (Test Driven Development). Para realizar a mudança era necessário aprender a utilizar outro framework, no caso o <a href="http://rspec.info">RSpec</a>.</span></p>
<p><span>Foi então que, acompanhando a blogosfera de Railers, através de um <a href="http://www.nomedojogo.com/2008/05/30/ruby-shoulda-bundle-para-textmate/">post do Carlos Brando</a>, conheci o <a title="Página do projeto Shoulda" href="http://www.thoughtbot.com/projects/shoulda">Shoulda</a>. O Shoulda é um framework recente e que eu considero como um passo intermediário entre o Test/Unit e o RSpec. Ele traz um conjunto de classes e métodos que melhoram o Test/Unit padrão, permitindo o uso de uma sintaxe parecida com a do RSpec. Assim é possível se aproximar de BDD sem ter muito impacto na forma de programar os testes.</span></p>
<p><span>Vou exemplificar aqui o migração dos testes de um model simples do <a href="http://www.sismiko.com">Sismiko</a>, a classe City que possui apenas os atributos “name” e “state_id”, representando o nome da cidade e o id do estado, respectivamente. </span></p>
<p><span>Observe o código utilizando o modo padrão:</span></p>
<pre class="brush: ruby;">
class CityTest &lt; Test::Unit::TestCase

fixtures :cities

  def test_name_required #testa se o nome da cidade é um campo requerido

    check_required(:name)

end

def test_state_required #testa se o campo state_id da cidade é um campo requerido

check_required(:state_id)

end

def test_max_name #testa se o tamanho máximo do campo nome é de 100 caracteres

city = create(:name =&gt; &quot;a&quot; * 101)

assert city.errors.invalid?(:name),&quot;name must have a maximum of 100 chars&quot;

assert_not_nil city.errors.on(:name)

assert !city.valid?, &quot;city shouldn't be created&quot;

end

private

def create(options={}) #cria uma cidade padrão

City.create({

:name =&gt; &quot;Maringá&quot;,

:state_id =&gt; 1

}.merge(options))

end

def check_required(att) #verifica se o campo passado em att é requerido pelo objeto

city = create(att =&gt; nil)

assert city.errors.invalid?(att)

assert_not_nil city.errors.on(att)

assert !city.valid?, &quot;city shouldn't be created&quot;

end

end
</pre>
<p><span>No código acima vemos três testes sendo feitos e mais dois métodos auxiliares, para criar um objeto com valores padrão em seus atributos e outro para verificar se um atributo é requerido. Quanto as testes, o primeiro e o segundo testes verificam se os campos “name” e “state_id” são obrigatórios ao criar um objeto de cidade. O terceiro verifica se o campo “name” aceita no máximo 100 caracteres.</span></p>
<p><span>Vejamos agora o código necessário para fazer os mesmo testes, usando a declaração de contextos pregada pelo BDD para deixar os testes mais legíveis, já utilizando o Shoulda:</span></p>
<pre class="brush: ruby;">
class CityTest &lt; Test::Unit::TestCase

fixtures :cities

context &quot;A City instance&quot; do

setup do

@city = create

end

should &quot;have a required name&quot; do

check_required(:name)

end

should &quot;have a required state&quot; do

check_required(:state_id)

end

context &quot;with a large name&quot; do #uso de contexto aninhado

setup do

@city.name = &quot;a&quot; * 101

@city.save

end

should &quot;validate max size of name&quot; do

assert city.errors.invalid?(:name)

end

end

end

private

def create(options={}) #cria uma cidade padrão

City.create({

:name =&gt; &quot;Maringá&quot;,

:state_id =&gt; 1

}.merge(options))

end

def check_required(att) #verifica se o campo passado em att é requerido pelo objeto

city = create(att =&gt; nil)

assert city.errors.invalid?(att)

assert_not_nil city.errors.on(att)

assert !city.valid?, &quot;city shouldn't be created&quot;

end

end
</pre>
<p><span>Com certeza ficou mais fácil de entender e também de localizar o erro. Por exemplo, caso o teste de atributo “name” requerido falhe, recebemos a seguinte mensagem:</span></p>
<blockquote><p><span>test: A City instance should have a required name</span></p></blockquote>
<p><span>O uso do novo framework melhorou a legibilidade dos testes, mas podemos melhorar ainda mais. Fazendo uso de helpers acrescentados pelo Shoulda, é possível reduzir o código para algo assim:</span></p>
<pre class="brush: ruby;"> 
CityTest &lt; Test::Unit::TestCase

  fixtures :cities

  should_require_attributes :name, :state_id #1

  should_ensure_length_in_range :name, (0...100) #2

end
</pre>
<p><span>Sem dúvida, muito mais simples. A linha comentada com #1 substitui dois testes escritos anteriormente, validando os campos “name” e “state_id” como requeridos. Em #2 verifica-se se o atributo “name” aceita valores com tamanho entre 0 e 100, rejeitando valores maiores.</p>
<p><span>Ficou impressionado? Instale o Shoulda e faça suas experiências, o projeto está no github:</span></p>
<blockquote><p><span>script/plugin install git://github.com/thoughtbot/shoulda.git</span></p></blockquote>
<p><span>Veja também:</span></p>
<p><span>O Lucas Hungaro fez um <a href="http://www.makemesimple.com/blog/2008/06/27/learncast1-bdd-leve-com-shoulda-testando-modelos-activerecord/"><span>screencast</span></a> muito bacana com uma introdução ao Shoulda.</span></p>
<p><span>Existem vários outros helpers além dos apresentados aqui. A documentação de todos eles pode ser encontrada na <a title="Documentação do Shoulda" href="http://dev.thoughtbot.com/shoulda">documentação </a><span><a title="Documentação do Shoulda" href="http://dev.thoughtbot.com/shoulda">do projeto</a></span>.</span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/flavio.wordpress.com/28/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/flavio.wordpress.com/28/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flavio.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flavio.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flavio.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flavio.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flavio.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flavio.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flavio.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flavio.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flavio.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flavio.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviogranero.com&blog=14701&post=28&subd=flavio&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://flaviogranero.com/2008/07/19/bdd-com-shoulda-menos-codigo-testes-mais-legiveis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da5b6b94a515e19d2e2fd53f88a2f006?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">flavio</media:title>
		</media:content>
	<feedburner:origLink>http://flaviogranero.com/2008/07/19/bdd-com-shoulda-menos-codigo-testes-mais-legiveis/</feedburner:origLink></item>
	</channel>
</rss>
