<?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>Rinaldi Fonseca</title>
	<atom:link href="http://rinaldifonseca.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://rinaldifonseca.com</link>
	<description>Ruby, Rails e desenvolvimento Web</description>
	<lastBuildDate>Sat, 13 Apr 2013 17:19:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Os 4 níveis do programador em relação aos testes</title>
		<link>http://rinaldifonseca.com/os-4-niveis-do-programador-em-relacao-aos-testes/</link>
		<comments>http://rinaldifonseca.com/os-4-niveis-do-programador-em-relacao-aos-testes/#comments</comments>
		<pubDate>Sat, 06 Apr 2013 00:45:27 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=256</guid>
		<description><![CDATA[Classificar é uma tarefa difícil, mas vamos tentar agrupar os programadores em 4 níveis em relação aos testes:

1) O atrasado: Ele não sabe o que é um teste. Ele escreve seu código, coloca em produção e nem se lembra que o software pode não funcionar como ele espera.
2) O ingênuo: Ele sabe como escrever testes [...]]]></description>
			<content:encoded><![CDATA[<p>Classificar é uma tarefa difícil, mas vamos tentar agrupar os programadores em 4 níveis em relação aos testes:<br />
<span id="more-256"></span><br />
1) <strong>O atrasado:</strong> Ele não sabe o que é um teste. Ele escreve seu código, coloca em produção e nem se lembra que o software pode não funcionar como ele espera.</p>
<p>2) <strong>O ingênuo:</strong> Ele sabe como escrever testes mas não enxerga muito valor. Normalmente escreve testes por obrigação ou para não passar vergonha diante da equipe. Ele é do tipo que se o build está quebrado e alguém pede para ele consertar, ele comenta o teste e faz git push. Também reclama muito que escrever testes demora muito e ele seria muito mais produtivo se não tivesse que testar.</p>
<p>3) <strong>O extremista:</strong> Ele valoriza o teste de forma extrema. Para ele, todo código deve ser testado. 100% de cobertura é o objetivo é a maior garantia. Até utiliza técnicas como TDD, BDD e outras, mas o que importa mesmo é ter teste para tudo, inclusive para código que ele não escreveu. Quanto mais teste por linha de código melhor.</p>
<p>4) <strong>O experiente:</strong> Ele entende os principais motivos para testar: melhorar o design do código, fornecer garantias etc. Compreende que nem tudo precisa ser testado e nem tudo é viável de testar. Por experiência e prática, ele testa aquilo que pode quebrar e não gasta tempo com testes inúteis que levam tempo demais para serem escritos. Pratica TDD quando faz sentido e não fica preso a &#8220;regrinhas&#8221;. </p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/os-4-niveis-do-programador-em-relacao-aos-testes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Herdar de Struct.new não é uma boa ideia</title>
		<link>http://rinaldifonseca.com/herdar-de-struct-new-nao-e-uma-boa-ideia/</link>
		<comments>http://rinaldifonseca.com/herdar-de-struct-new-nao-e-uma-boa-ideia/#comments</comments>
		<pubDate>Sat, 26 Jan 2013 20:23:59 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=251</guid>
		<description><![CDATA[Com a nova tendência de se pensar duas vezes antes de herdar de ActiveRecord::Base, vejo muitos códigos utilizando a abordagem de herdar de Struct.new. Isso não é uma boa ideia.

A ideia seria mais ou menos esta:

class User &#60; Struct.new&#40;:name, :email&#41;
  def info
     &#34;#{name} - #{email}&#34;
  end
end
User.new&#40;&#34;Rinaldi&#34;, &#34;mail@gmail.com&#34;&#41;.info

Esta não é [...]]]></description>
			<content:encoded><![CDATA[<p>Com a nova tendência de se pensar duas vezes antes de herdar de <strong>ActiveRecord::Base</strong>, vejo muitos códigos utilizando a abordagem de herdar de <strong>Struct.new</strong>. Isso não é uma boa ideia.<br />
<span id="more-251"></span><br />
A ideia seria mais ou menos esta:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:email</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> info
     <span style="color:#996600;">&quot;#{name} - #{email}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
User.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Rinaldi&quot;</span>, <span style="color:#996600;">&quot;mail@gmail.com&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">info</span></pre></div></div>

<p>Esta não é uma boa ideia porque se a esta classe User for carregada duas vezes, será lançado o seguinte erro: <strong>&#8220;TypeError: superclass mismatch for class User&#8221;</strong></p>
<p>Isso ocorre pelo seguinte: A cada vez que a classe for definida, <strong>uma nova instância</strong> do Struct será criada.<br />
Se a classe for carregada pela segunda vez, User já vai ter uma referência.<br />
Em projetos Rails este erro poderia seria comum.</p>
<p>Se você realmente deseja fazer uma abordagem neste estilo, melhor seria utilizar um bloco da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">User = <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:email</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> info
    <span style="color:#996600;">&quot;#{name} - #{email}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
User.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Rinaldi&quot;</span>, <span style="color:#996600;">&quot;mail@gmail.com&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">info</span></pre></div></div>

<p>A mudança foi praticamente mínima e o possível erro será evitado.</p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/herdar-de-struct-new-nao-e-uma-boa-ideia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Falácia do espantalho na programação</title>
		<link>http://rinaldifonseca.com/falacia-do-espantalho-na-programacao/</link>
		<comments>http://rinaldifonseca.com/falacia-do-espantalho-na-programacao/#comments</comments>
		<pubDate>Mon, 07 Jan 2013 00:20:53 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Boas práticas]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=245</guid>
		<description><![CDATA[Pode ser coincidência, mas nos últimos tempos tenho visto muito a utilização da falácia do espantalho na comunidade.

Para quem ainda não conhece esta falácia, a definição seria esta: &#8220;toda argumentação que visa distorcer e/ou exagerar pontos sustentados por uma outra ideia, levando a discussão para um cenário favorável ao seu ponto de vista&#8221;.
Um exemplo desta [...]]]></description>
			<content:encoded><![CDATA[<p>Pode ser coincidência, mas nos últimos tempos tenho visto muito a utilização da falácia do espantalho na comunidade.<br />
<span id="more-245"></span><br />
Para quem ainda não conhece esta falácia, a definição seria esta: <strong>&#8220;toda argumentação que visa distorcer e/ou exagerar pontos sustentados por uma outra ideia, levando a discussão para um cenário favorável ao seu ponto de vista&#8221;.</strong></p>
<p>Um exemplo desta falácia pode ser vista no seguinte post: <strong><a href="http://david.heinemeierhansson.com/2012/dependency-injection-is-not-a-virtue.html">Dependency injection is not a virtue</a></strong></p>
<p>Como o título do post sugere, o autor apresenta alguns argumentos falaciosos que poderão levar o leitor a acreditar que usar <strong>injeção de dependência</strong> não é uma boa ideia.</p>
<p>Basicamente, o autor apresenta  o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> publish!
  <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">update_attributes</span><span style="color:#006600; font-weight:bold;">&#40;</span>created_at: <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>E comenta que em linguagens como Ruby, podemos simplesmente usar <strong>stubs</strong> para testar o comportamento, mas em por influência de linguagens não tão flexíveis, acabamos achando necessário acrescentar um parâmetro no método publish! para poder fazer a injeção da dependência e com isso ficar mais fácil escrever o teste.</p>
<p>O código ficaria assim:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> publish!<span style="color:#006600; font-weight:bold;">&#40;</span>time=<span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">update_attributes</span><span style="color:#006600; font-weight:bold;">&#40;</span>created_at: time<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Resumindo, ele critica a técnica de injeção de depedência argumentando que sua utilização é necessária apenas para facilitar o teste. Resumindo, seria assim: <strong>&#8220;Muitas pessoas usam injeção de dependência para facilitar o teste, logo não existe virtude em utilizar&#8221;. </strong><br />
Perceberam como o  argumento é falacioso?</p>
<p>Não precisa ser expert no assunto para ver que isso não é verdade. Com pouco tempo de estudo e prática, percebe-se que a utilização desta técnica traz muitas vantagens.<br />
Em um post anterior, eu mesmo <a href="http://rinaldifonseca.com/design-de-codigo-adapter-pattern-em-ruby/">falei sobre o assunto</a>.</p>
<p>No geral eu concordo que modelar seu código para que o mesmo fique mais fácil de testar não é o ideal. Porém, este argumento <strong>não é válido o suficiente</strong> para afirmar que não existe virtude em utilizar injeção de dependência.</p>
<p>O correto deveria ser o oposto. Fazer um bom design para que a facilidade de testar seja uma consequência.</p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/falacia-do-espantalho-na-programacao/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Design de código &#8211; Adapter pattern em Ruby</title>
		<link>http://rinaldifonseca.com/design-de-codigo-adapter-pattern-em-ruby/</link>
		<comments>http://rinaldifonseca.com/design-de-codigo-adapter-pattern-em-ruby/#comments</comments>
		<pubDate>Thu, 29 Nov 2012 00:10:51 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Design Patterns]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=240</guid>
		<description><![CDATA[O Design do código determina o quão fácil será uma possível mudança.
Neste post mostrarei um exemplo prático de como podemos modelar nosso código para ter mais flexibilidade.

Grande parte das aplicações Web necessitam de algum sistema de filas para realizarem determinados trabalhos em background. Dois dos mais conhecidos no mundo Ruby são: Resque e Sidekiq.
Desta forma, [...]]]></description>
			<content:encoded><![CDATA[<p>O Design do código determina o quão fácil será uma possível mudança.<br />
Neste post mostrarei um exemplo prático de como podemos modelar nosso código para ter mais flexibilidade.<br />
<span id="more-240"></span></p>
<p>Grande parte das aplicações Web necessitam de algum sistema de filas para realizarem determinados trabalhos em background. Dois dos mais conhecidos no mundo Ruby são: <strong>Resque e Sidekiq</strong>.</p>
<p>Desta forma, quando precisamos enfileirar algum Job para ser executado em background, fazemos algo como:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyService
   <span style="color:#9966CC; font-weight:bold;">def</span> do_something<span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#41;</span>
      Resque.<span style="color:#9900CC;">enqueue</span><span style="color:#006600; font-weight:bold;">&#40;</span>MyWorker, params<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></pre></div></div>

<p><strong>Existe algum problema com isso?</strong></p>
<p>Sim. É praticamente certo que a chamada <strong>Resque.enqueue</strong> será espalhada por toda a aplicação. O problema ficará evidente quando precisarmos mudar o sistema de filas. Se atualmente usamos o Resque e decidimos migrar para Sideqik, teremos que alterar várias partes da aplicação. É importante notar que uma mudança deste tipo não é totalmente incomum. Já vi muitos projetos(grandes inclusive) mudarem.</p>
<p>Logo, quanto mais flexível estiver nosso código, menos trabalho teremos. Sempre devemos escrever código pensando que ele poderá mudar.</p>
<p><strong>Como resolver?</strong></p>
<p><strong>Segue abaixo um exemplo de modelagem que costumo utilizar:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ResqueAdapter
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">push</span><span style="color:#006600; font-weight:bold;">&#40;</span>MyJob, params<span style="color:#006600; font-weight:bold;">&#41;</span> 
    Resque.<span style="color:#9900CC;">enqueue</span><span style="color:#006600; font-weight:bold;">&#40;</span>MyJob, params<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>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> SideKiqAdapter
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">push</span><span style="color:#006600; font-weight:bold;">&#40;</span>MyJob, params<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#6666ff; font-weight:bold;">Sidekiq::Client</span>.<span style="color:#9900CC;">enqueue</span><span style="color:#006600; font-weight:bold;">&#40;</span>MyJob, params<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>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> MyService
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:queue_adapter</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>adapter = ResqueAdapter<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@queue_adapter</span> = adapter
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> do_something<span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@queue_adapter</span>.<span style="color:#9900CC;">push</span><span style="color:#006600; font-weight:bold;">&#40;</span>MyJob, params<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></pre></div></div>

<p><strong>Comentários:</strong></p>
<p><strong>1)</strong> A ideia é implementar o Adapter Pattern. No caso, temos uma classe chamada MyService que possui um método que irá enfileirar um Job. Nosso objetivo é que qualquer cliente que precise enfileirar um Job conheça uma interface única e bem definida. No exemplo, esta interface é o método push. Logo, toda a aplicação irá &#8220;saber&#8221; que para enfileirar um Job, precisará do método push com seus devidos parâmetros.<br />
Com isso iremos evitar o Resque.enqueue por toda a aplicação.</p>
<p><strong>2)</strong> No exemplo, o adapter padrão é o ResqueAdapter. Se em determinado momento decidirmos mudar para o SideKiq basta utilizar o SideKiq realizando a mudança em apenas um ponto, pois temos flexibilidade.</p>
<p><strong>3)</strong> Estamos aplicando o Open/closed principle mantendo a interface fechada e modificando a implementação através da injeção de dependência e duck typing</p>
<p><strong>Finalizando</strong></p>
<p>A ideia aqui é mostrar que pequenas decisões no Design podem trazer grandes ganhos.<br />
No Rails 4 teremos uma API bem definida para enfileirar Jobs e teremos ganhos semelhantes aos que citei acima. </p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/design-de-codigo-adapter-pattern-em-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Retornando JSON com Rails Metal</title>
		<link>http://rinaldifonseca.com/retornando-json-com-rails-metal/</link>
		<comments>http://rinaldifonseca.com/retornando-json-com-rails-metal/#comments</comments>
		<pubDate>Tue, 18 Sep 2012 03:16:49 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=235</guid>
		<description><![CDATA[Durante o desenvolvimento de uma feature no atual projeto em que trabalho, precisei adicionar um autocomplete de endereço com base no CEP.
Para isso utilizei um web service interno e como este serviço não fica disponível fora da rede interna não poderia consumir diretamente com JavaScript.
Desta forma, estou fazendo a consulta ao web service a partir [...]]]></description>
			<content:encoded><![CDATA[<p>Durante o desenvolvimento de uma feature no atual projeto em que trabalho, precisei adicionar um autocomplete de endereço com base no CEP.<br/><span id="more-235"></span><br />
Para isso utilizei um web service interno e como este serviço não fica disponível fora da rede interna não poderia consumir diretamente com JavaScript.</p>
<p>Desta forma, estou fazendo a consulta ao web service a partir da aplicação Rails.<br />
Como esta consulta deve ser rápida e não precisava de todo o stack do Rails, utilizei um controller Metal ao invés de um comum.</p>
<p>Eu já sabia que utilizando Rails Metal conseguiria processar muito mais requests mas como tínhamos que retornar um JSON, precisamos adicionar 4 módulos ( <strong>ActionController::Rendering, ActionController::Renderers::All, ActionController::MimeResponds, ActionController::ImplicitRender</strong> ) e neste ponto já não sabia se após incluir estes 4 módulos a performance continuaria a mesma.</p>
<p>Fiz um teste rápido com <a href="http://www.hpl.hp.com/research/linux/httperf/">Httperf</a> e verifiquei que ainda assim foi possível processar <strong>mais que o  dobro de requests</strong>.</p>
<p>Se tiverem alguma situação semelhante, acredito que valha a pena a utilização.<br />
Poderíamos montar uma simples <a href="http://rinaldifonseca.com/rack-para-leigos-ruby-webserver-interface/">Rack App</a> para poder fazer esta consulta e retornar o JSON, mas considerei o resultado obtido como suficiente.</p>
<p>Abaixo uma versão resumida do código:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Metal</span>
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Rendering</span>
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Renderers::All</span>  
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">ActionController::MimeResponds</span>
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">ActionController::ImplicitRender</span> 
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> index
   <span style="color:#008000; font-style:italic;">#uma consulta qualquer </span>
   render <span style="color:#ff3333; font-weight:bold;">:json</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>:resultado <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:teste</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/retornando-json-com-rails-metal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Presenters em aplicações Rails com a Gem ClassicPresenter</title>
		<link>http://rinaldifonseca.com/presenters-em-aplicacoes-rails-com-a-gem-classicpresenter/</link>
		<comments>http://rinaldifonseca.com/presenters-em-aplicacoes-rails-com-a-gem-classicpresenter/#comments</comments>
		<pubDate>Tue, 26 Jun 2012 04:56:34 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=227</guid>
		<description><![CDATA[Gosto de Design Patterns e a cada dia procuro melhorar meu código aplicando alguns.
Nos últimos tempos tenho usado bastante a ideia de &#8220;Presenters&#8221;. Neste post irei explicar sua utilização.

Antes de mais nada, é importante destacarmos o problema que os Presenters se propõem a resolver. No MVC(model view controller) temos a View como responsável por apresentar [...]]]></description>
			<content:encoded><![CDATA[<p>Gosto de Design Patterns e a cada dia procuro melhorar meu código aplicando alguns.<br />
Nos últimos tempos tenho usado bastante a ideia de &#8220;Presenters&#8221;. Neste post irei explicar sua utilização.<br />
<span id="more-227"></span></p>
<p>Antes de mais nada, é importante destacarmos o problema que os Presenters se propõem a resolver. No MVC(model view controller) temos a View como responsável por apresentar os dados. Com isso existe uma forte tendência de sobrecarregarmos esta camada inserindo lógica, tratamento de dados etc.</p>
<p>Desta forma, a ideia de utilizar Presenters é tirar todas estas responsabilidades da View com a utilização de objetos especializados. Este termo foi inicialmente trazido para a comunidade Rails por Jay Fields <a href="http://blog.jayfields.com/2007/03/rails-presenter-pattern.html">neste post de 2007</a>. Atualmente alguns desenvolvedores preferem usar outros nomes e variações. Particularmente gosto(ou será costume?) do nome &#8220;Presenter&#8221; e nest post estou f<strong>ocando na ideia</strong> de sua utilização. Neste contexto não estou me importando com o nome que iremos chamar este &#8220;tipo&#8221; de objeto. Quero focar na ideia.</p>
<p>Se tratando de implementação, Presenter é uma espécie de <strong>Decorator</strong>. Decorator é um pattern cuja responsabilidade é adicionar funcionalidades a uma classe.<br />
No caso dos Presenters, sua responsabilidade é adicionar responsabilidade de apresentação a uma classe.</p>
<p>Se tratando de implementar Design Patterns, sempre seguiremos &#8220;regras&#8221;. Se o pattern X diz que devemos implementar de determinada maneira, &#8220;deveremos&#8221; seguir. Porém, não sou 100% purista a ponto de não me permitir modificar o que considero necessário. Desta forma vou listar abaixo algumas características que particularmente considero importante nos Presenters que uso.</p>
<p><strong>1) Ser um Decorator real</strong>: Como disse acima, um Presenter é um Decorator. Ser um decorator real significa implementar o Presenter de forma a ter sua interface transparente em relação ao objeto que ele decora. Desta forma os métodos invocados no Presenter serão delegados para o objeto decorado(caso o Presenter não os implemente). </p>
<p><strong>2) Composição/Modificação com foco na apresentação</strong>: Esta é a característica principal. O Presenter irá decorar o objeto podendo inclusive adicionar novos métodos responsáveis em realizar alguma formatação. Ex: Podemos ter um método responsável em formatar uma Data ou exibir um nome de determinada maneira.</p>
<p><strong>3) Possibilidade de acesso ao contexto corrente</strong>: Se tratando de aplicações Rails por exemplo, podemos considerar 2 tipos de contextos: Controllers e Views. A ideia é que de dentro dos Presenters consigamos ter acesso a métodos ou variáveis de instâncias do contexto. Com isso podemos ter métodos que levem em consideração o estado de elementos que estão presentes no contexto. Ex: Podemos ter um método em nosso Presenter que exiba determinada informação apenas se o usuário estiver logado. Para sabermos se o usuário está logado podemos acessar o contexto e verificar esta condição.<br />
<strong>Este é um caso que poderíamos por exemplo, remover alguns IFS das views.</strong></p>
<p>Com o objetivo de implementar estas 3 características, criei uma <a href="https://github.com/rinaldifonseca/classic_presenter">gem chamada ClassicPresenter</a>. O código é absolutamente simples e foi inspirado em algumas outras implementações de &#8220;Presenters&#8221; de outros desenvolvedores. Decidi criar a gem após ter percebido que eu repeti o mesmo código nos últimos 3 projetos que trabalhei. </p>
<p><strong>Exemplo de utilização:</strong></p>
<p>Para simplificar o exemplo vou considerar que temos uma aplicação Rails com os seguintes items:</p>
<p><strong>1) Um CRUD básico de Produtos(ex: rails generate scaffold Product name description)<br />
2) Sistema de autenticação com a gem Devise</strong></p>
<p>Dados que estamos neste ponto, podemos seguir os seguintes passos:</p>
<p><strong>1) </strong>Instale a gem ClassicPresenter adicionando a seguinte linha em seu Gemfile e em seguinda rode o comando  bundle install</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">'classic_presenter'</span></pre></div></div>

<p><strong>2) </strong>Crie um Presenter para a classe Product(que você criou com seu CRUD) com o seguinte comando:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">rails generate  presenter Product</pre></div></div>

<p>Este generator irá criar um arquivo chamado<strong> product_presenter.rb</strong> dentro do diretório <strong>app/presenters</strong></p>
<p><strong>3)</strong> Adicione o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ProductPresenter <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ClassicPresenter::Base</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> display_name
      <span style="color:#9966CC; font-weight:bold;">if</span> context.<span style="color:#9900CC;">user_signed_in</span>?
        context.<span style="color:#9900CC;">link_to</span> name, context.<span style="color:#9900CC;">product_path</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        name
      <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> display_description
    <span style="color:#008000; font-style:italic;">#crie uma partial chamada description para poder usar este método</span>
    context.<span style="color:#9900CC;">render</span> <span style="color:#996600;">&quot;products/description&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:product</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">self</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Basicamente, nosso Presenter implementa as 3 características que citei acima. Como ele decora uma instância da classe Product qualquer método que invocarmos no Presenter será delegado para a instância de um Product a menos que o Presenter implemente.</p>
<p>Agora vou listar abaixo alguns detalhes referente ao código acima:</p>
<p><strong>a) </strong>Dentro de qualquer método do Presenter teremos acesso ao context. Se o Presenter foi  instanciado na View, ela será o context. Logo teremos acesso a todos os métodos da View como por exemplo link_to, number_to_currency, ou até o current_user que é um método de nossa View provido pela gem Devise </p>
<p><strong>b) </strong>Perceba que quando invocamos o método name, este será delegado para o objeto decorado.</p>
<p><strong>4)</strong> Utilizando o Presenter na View:</p>
<p>Nossa View do arquivo <strong>show.html.erb </strong>poderia ser implementada da seguinte forma sem o Presenter:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">if</span> user_signed_in? <span style="color:#006600; font-weight:bold;">%&gt;</span>
<span style="color:#006600; font-weight:bold;">&lt;%</span>= link_to <span style="color:#0066ff; font-weight:bold;">@product</span>.<span style="color:#9900CC;">name</span>, product_path <span style="color:#006600; font-weight:bold;">%&gt;</span>
<span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">else</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
<span style="color:#006600; font-weight:bold;">&lt;%</span>= <span style="color:#0066ff; font-weight:bold;">@product</span>.<span style="color:#9900CC;">name</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
<span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&lt;%</span> render <span style="color:#996600;">&quot;products/description&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:product</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@product</span> <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></div></div>

<p>Utilizando nosso Presenter podemos refatorar esta View para a seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span> present ProductPresenter, <span style="color:#0066ff; font-weight:bold;">@product</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>presenter<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
<span style="color:#006600; font-weight:bold;">&lt;%</span>= presenter.<span style="color:#9900CC;">display_name</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
<span style="color:#006600; font-weight:bold;">&lt;%</span>= presenter.<span style="color:#9900CC;">display_description</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
<span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></div></div>

<p>A seguir as vantagens que eu vejo que com esta mudança:</p>
<ul>
<li>Retiramos toda a lógica da View e encapsulamos em um objeto</li>
<li>Aplicamos o princípio tell don&#8217;t ask e simplesmente dizemos para nosso presenter &#8220;apresenter&#8221; os dados</li>
<li>Tendo acesso ao contexto de dentro do Presenter podemos realizar praticamente toda tarefa que necessitarmos se estivéssemos diretamente na View</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/presenters-em-aplicacoes-rails-com-a-gem-classicpresenter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Boas práticas de Design em aplicações Ruby on Rails</title>
		<link>http://rinaldifonseca.com/boas-praticas-de-design-em-aplicacoes-ruby-on-rails/</link>
		<comments>http://rinaldifonseca.com/boas-praticas-de-design-em-aplicacoes-ruby-on-rails/#comments</comments>
		<pubDate>Fri, 15 Jun 2012 01:42:46 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Palestras]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=219</guid>
		<description><![CDATA[No dia 12 de maio aconteceu o 5º Encontro Guru Sorocaba &#8211; Secot Ufscar onde dei uma palestra sobre &#8220;Boas práticas de Design em aplicações Ruby on Rails&#8221;. 
Voce pode visualizar os slides neste link e acompanhar o vídeo abaixo:

]]></description>
			<content:encoded><![CDATA[<p>No dia 12 de maio aconteceu o 5º Encontro Guru Sorocaba &#8211; Secot Ufscar onde dei uma palestra sobre &#8220;Boas práticas de Design em aplicações Ruby on Rails&#8221;. <br/><span id="more-219"></span></p>
<p>Voce pode visualizar os slides neste <strong><a href="http://www.slideshare.net/rinaldifonsecanascimento/boas-prticas-de-design-em-aplicaes-rails">link</a></strong> e acompanhar o vídeo abaixo:</p>
<p><iframe src="http://blip.tv/play/hOdBgvrIaAI.html?p=1" width="596" height="334" frameborder="0" allowfullscreen></iframe><embed type="application/x-shockwave-flash" src="http://a.blip.tv/api.swf#hOdBgvrIaAI" style="display:none"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/boas-praticas-de-design-em-aplicacoes-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ActiveSupport::Memoizable is deprecated &#8211; Rails 3.2</title>
		<link>http://rinaldifonseca.com/activesupportmemoizable-is-deprecated-rails-3-2/</link>
		<comments>http://rinaldifonseca.com/activesupportmemoizable-is-deprecated-rails-3-2/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 02:16:00 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=216</guid>
		<description><![CDATA[ActiveSupport::Memoizable está depreciado a partir do Rails 3.2

No grande refactoring que o Rails sofreu na sua terceira versão, a maioria das referências do &#8220;Memoizable&#8221; foram trocadas pelo padrão  @var &#124;&#124;= com o objetivo de simplificar as coisas.
Desta forma, se utilizarmos o ActiveSupport::Memoizable  iremos receber o seguinte warning:

ActiveSupport::Memoizable is deprecated and will be removed [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ActiveSupport::Memoizable</strong> está depreciado a partir do <strong>Rails 3.2</strong><br />
<span id="more-216"></span><br />
No grande refactoring que o Rails sofreu na sua terceira versão, a maioria das referências do &#8220;Memoizable&#8221; foram trocadas pelo padrão  <strong>@var ||=</strong> com o objetivo de simplificar as coisas.</p>
<p>Desta forma, se utilizarmos o <strong>ActiveSupport::Memoizable</strong>  iremos receber o seguinte warning:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActiveSupport::Memoizable</span> is deprecated <span style="color:#9966CC; font-weight:bold;">and</span> will be removed <span style="color:#9966CC; font-weight:bold;">in</span> future releases,simply use Ruby instead</pre></div></div>

<p><strong>O que significa &#8220;simply use Ruby instead&#8221; ?<br />
</strong></p>
<p><strong>Podemos transformar isso:<br />
</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyClass
  extend <span style="color:#6666ff; font-weight:bold;">ActiveSupport::Memoizable</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> method
     <span style="color:#0066ff; font-weight:bold;">@result</span> = <span style="color:#008000; font-style:italic;">#some code</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  memoize <span style="color:#ff3333; font-weight:bold;">:method</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><strong>Nisso:<br />
</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyClass
  <span style="color:#9966CC; font-weight:bold;">def</span> method
   <span style="color:#0066ff; font-weight:bold;">@result</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#9966CC; font-weight:bold;">begin</span>
     <span style="color:#008000; font-style:italic;">#some code</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>

]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/activesupportmemoizable-is-deprecated-rails-3-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Usando dynamic omniauth scopes em uma aplicação Rails</title>
		<link>http://rinaldifonseca.com/usando-dynamic-omniauth-scopes-em-uma-aplicacao-rails/</link>
		<comments>http://rinaldifonseca.com/usando-dynamic-omniauth-scopes-em-uma-aplicacao-rails/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 18:33:26 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=208</guid>
		<description><![CDATA[Atualmente, é comum ter múltiplos mecanismos de autenticação em aplicações web.
A Gem Omniauthpermite adicionarmos este recurso em uma aplicação Rails facilmente.
Com ela podemos permitir que usuário se autentique em nosso site utilizando diversas estratégias.

Durante o processo de autenticação, existe uma etapa em que o usuário é redirecionado para o serviço da estratégia(Facebook por exemplo) e [...]]]></description>
			<content:encoded><![CDATA[<p>Atualmente, é comum ter múltiplos mecanismos de autenticação em aplicações web.<br />
A Gem <a href="https://github.com/intridea/omniauth/">Omniauth</a>permite adicionarmos este recurso em uma aplicação Rails facilmente.<br />
Com ela podemos permitir que usuário se autentique em nosso site utilizando diversas estratégias.<br />
<span id="more-208"></span></p>
<p>Durante o processo de autenticação, existe uma etapa em que o usuário é redirecionado para o serviço da estratégia(Facebook por exemplo) e neste momento a nossa aplicação registrada no serviço irá solicitar a autorização do usuário. Esta autorização varia de serviço para serviço, mas no caso do Facebook por exemplo, poderia ser pedido as informações básicas do usuário, como nome, e-mail etc, ou permissões extendidas, como por exemplo a possibilidade de postar no mural do usuário.</p>
<p>Para maiores detalhes sobre como implementar todo o processo de autenticação com o Omniauth sugiro que visite este link <a href="https://github.com/intridea/omniauth/">https://github.com/intridea/omniauth/wiki</a></p>
<p>Para este tutorial, a parte mais importante é a configuração.</p>
<p><strong>Um exemplo padrão seria:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Rails.<span style="color:#9900CC;">application</span>.<span style="color:#9900CC;">config</span>.<span style="color:#9900CC;">middleware</span>.<span style="color:#9900CC;">use</span> <span style="color:#6666ff; font-weight:bold;">OmniAuth::Builder</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  provider <span style="color:#ff3333; font-weight:bold;">:facebook</span>, ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'FACEBOOK_KEY'</span><span style="color:#006600; font-weight:bold;">&#93;</span>, ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'FACEBOOK_SECRET'</span><span style="color:#006600; font-weight:bold;">&#93;</span>, 
                <span style="color:#ff3333; font-weight:bold;">:scope</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'email,publish_stream,read_stream'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Perceba que no <strong>:scope</strong> estamos listando os tipos de permissões que iremos pedir ao usuário.<br />
No caso do Facebook, se esta lista estivesse vazia, por padrão iria ser pedido apenas as <strong>informações básicas</strong> do usuário.</p>
<p>Para o cenário de autenticações, é recomendado pedir sempre o <strong>mínimo possível</strong>. Se não precisamos de nenhuma permissão de escrita para a autenticação, não faz sentido pedi-la.</p>
<p>O problema é que se em outro ponto de nossa aplicação necessitarmos a permissão de escrita, teremos que setar em nossa configuração inicial, e neste caso o usuário <strong>deverá</strong> aceitar o publish_stream(escrita) para fazer apenas a autenticação.</p>
<p>A solução para isso é pedir as permissões(scopes) <strong>dinamicamente</strong>.<br />
Para isso basta fazer a configuração da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Rails.<span style="color:#9900CC;">application</span>.<span style="color:#9900CC;">config</span>.<span style="color:#9900CC;">middleware</span>.<span style="color:#9900CC;">use</span> <span style="color:#6666ff; font-weight:bold;">OmniAuth::Builder</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  provider <span style="color:#ff3333; font-weight:bold;">:facebook</span>, ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'FACEBOOK_KEY'</span><span style="color:#006600; font-weight:bold;">&#93;</span>, ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'FACEBOOK_SECRET'</span><span style="color:#006600; font-weight:bold;">&#93;</span>, 
              <span style="color:#ff3333; font-weight:bold;">:scope</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'email,publish_stream,read_stream'</span>,
              <span style="color:#ff3333; font-weight:bold;">:setup</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>env<span style="color:#006600; font-weight:bold;">|</span> env<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'omniauth.strategy'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">options</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:scope</span><span style="color:#006600; font-weight:bold;">&#93;</span> = env<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'rack.session'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'facebook_scopes'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Adicionando o parâmetro setup conseguimos definir quais scopes desejamos usar dinamicamente. Neste caso estamos recuperando a lista de scopes da sessão, com a chave <strong>&#8216;facebook_scopes&#8217;</strong></p>
<p>Desta forma, basta setar a lista de scopes dentro de um <strong>controller</strong>, e em seguida redirecionarmos o usuário para a URL de redirecionamento para o serviço. Normalmente esta URL segue o padrão<strong> /auth/provider</strong>. No caso do Facebook seria <strong>/auth/facebook</strong></p>
<p>Esta URL irá redirecionar o usuário para o Facebook onde deverá aceitar ou não as permissões que serão pedidas.</p>
<p>Veja o exemplo de um controller:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> HomeController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    session<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:facebook_scopes</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;email, publish_stream&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/usando-dynamic-omniauth-scopes-em-uma-aplicacao-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Retrospectiva 2011</title>
		<link>http://rinaldifonseca.com/retrospectiva-2011/</link>
		<comments>http://rinaldifonseca.com/retrospectiva-2011/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 01:18:47 +0000</pubDate>
		<dc:creator>Rinaldi Fonseca</dc:creator>
				<category><![CDATA[Carreira]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=202</guid>
		<description><![CDATA[Até o presente momento havia publicado apenas posts técnicos, mas agora vou tentar iniciar uma série sobre outros assuntos que também me interessam e de certa forma estão relacionados com minha carreira. Iniciarei com uma retrospectiva.

2011 foi de longe um dos melhores anos que já tive. Profissionalmente e pessoalmente.
Já tinha me mudado para São Paulo [...]]]></description>
			<content:encoded><![CDATA[<p>Até o presente momento havia publicado apenas posts técnicos, mas agora vou tentar iniciar uma série sobre outros assuntos que também me interessam e de certa forma estão relacionados com minha carreira. Iniciarei com uma retrospectiva.<br />
<span id="more-202"></span><br />
2011 foi de longe um dos melhores anos que já tive. Profissionalmente e pessoalmente.<br />
Já tinha me mudado para São Paulo em 2010 com o objetivo de empreender e colocar uma ideia em prática. Mas foi em 2011 que tomei uma das decisões mais difíceis da minha vida, que foi a de deixar a vida do empreendedorismo e focar 100% em minha carreira como Desenvolvedor de Software.</p>
<p>A escolha foi difícil pois implicaria em muitas mudanças. Entre as mais difíceis eram: deixar grandes amigos, deixar a empresa que ajudei a fundar e ainda &#8220;enfrentar&#8221; um mundo desconhecido até então. O mundo das Consultorias.</p>
<p><strong>2011 &#8211; Fase 1</strong></p>
<p>Tive a sorte de conhecer grandes pessoas, e mesmo correndo o risco de não lembrar de algumas, não posso deixar de citar alguns nomes. O primeiro, <strong>Diego Carrion(@dcrec1)</strong> que no início de Janeiro de 2011 abriu uma grande porta em minha carreira me convidando para trabalhar no time de <strong>Rails</strong> da<a href="http://www.gonow.com.br"> Gonow Tecnologia</a>. </p>
<p>A minha meta para 2011 era muito simples: Aprender o máximo que eu puder. E a melhor maneira de conseguir isso, seria trabalhando com pessoas tecnicamente melhores do que eu. Felizmente eu tive esta oportunidade.</p>
<p>Atuando como consultor tive a oportunidade de passar por vários projetos em empresas grandes de pequenas. Participei de vários projetos. &#8220;Coloquei a mão&#8221; em muitos códigos diferentes. Escrevi código ruim e tive a felicidade de  receber críticas construtivas nos comentários do Github. Desenvolvi uma certa habilidade de &#8220;pegar o projeto andando&#8221; e ter que me virar. Enfim, aprendi muito mais do que achava que poderia aprender.</p>
<p>Para fechar a fase 1, uma outra pessoa que gostaria de citar é o<strong> Ricardo Almeida(@almeidaricardo) </strong>que me deu uma grande força no primeiro projeto que participei.</p>
<p><strong>2011 &#8211;  Fase 2</strong></p>
<p>Dizem por ai que a única constante é a mudança. Concordo com isso, e por este motivo chego na fase 2. Mantendo o foco na minha principal meta para 2011 decidi que seria mais interessante para minha carreira me dedicar ainda mais em Ruby e trabalhar em alguns projetos diferentes. Desta forma aceitei o convite para trabalhar na <a href="http://www.codeminer42.com">Codeminer42</a> e aproveito para agradecer ao<strong> Fábio Akita(@akitaonrails)</strong> pela confiança.<br />
Continuo tendo a sorte de trabalhar com excelentes pessoas e excelentes projetos. Se continuarmos com o mesmo foco que tivemos nos últimos 3 meses, 2012 será ainda melhor!</p>
<p>Com isso fecho o ano com a certeza de que aprendi muito e ainda não sei nada, e isso é o que mais me motiva para tentar fazer o próximo ano ainda melhor.</p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/retrospectiva-2011/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
