<?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>LucasAllan.com</title>
	<atom:link href="http://www.lucasallan.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.lucasallan.com</link>
	<description>&#34;Where there is a shell, there is a way.&#34;</description>
	<lastBuildDate>Thu, 12 Aug 2010 19:13:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>Desenvolvimento com Rails, mongoid,  rspec e cucumber</title>
		<link>http://www.lucasallan.com/?p=307</link>
		<comments>http://www.lucasallan.com/?p=307#comments</comments>
		<pubDate>Thu, 12 Aug 2010 18:22:09 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Mongodb]]></category>
		<category><![CDATA[NoSql]]></category>
		<category><![CDATA[RSpec]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[mongoid]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=307</guid>
		<description><![CDATA[Nesse rápido post irei demonstrar como iniciar o desenvolvimento de uma aplicação com o Rails 2.3.8, utilizando como banco de dados NoSql o Mongodb. Para conexão com o banco, utilizaremos a gem Mongoid. Também iremos configurar para testes o Rspec e o Cucumber. Considerando a parti daqui que você tem todas as gems citadas anteriormente [...]]]></description>
			<content:encoded><![CDATA[<p>Nesse rápido post irei demonstrar como iniciar o desenvolvimento de uma aplicação com o <a href="http://github.com/rails/rails">Rails</a> 2.3.8, utilizando como banco de dados <a href="pt.wikipedia.org/wiki/NoSQL">NoSql</a> o <a href="www.mongodb.org">Mongodb</a>.<br />
Para conexão com o banco, utilizaremos a gem <a href="http://mongoid.org">Mongoid</a>. Também iremos configurar para testes o <a href="http://rspec.info">Rspec</a> e o <a href="cukes.info">Cucumber</a>. Considerando a parti daqui que você tem todas as <a href="rubygems.org">gems</a> citadas anteriormente instaladas no seu ambiente.<br />
Primeiro começaremos criando uma aplicação Rails, nada de novo aqui.</p>
<p>rails app_teste</p>
<p>Com isso iremos gerar toda a estrutura da aplicação. Agora vamos configurar as <a href="rubygems.org">gems</a> utilizadas, em &#8216;config/enviroment.rb&#8217;, adicionaremos dentro do bloco &#8216;Rails::Initializer.run&#8217; a gem do mongoid:</p>
<pre class="brush: ruby;">
Rails::Initializer.run do |config|
  config.gem 'mongoid'
  config.time_zone = 'UTC'
end
</pre>
<p>Com a gem do Mongoid, não precisaremos mais do <a href="http://ar.rubyonrails.org/">ActiveRecord</a>, para remover de sua aplicação basta adicionar dentro do mesmo bloco que você configurou o a gem, a seguinte linha &#8216;config.frameworks -= [:active_record]&#8216;. Deixando meu <em>enviroment.rb</em> assim:</p>
<pre class="brush: ruby;">
Rails::Initializer.run do |config|
  config.frameworks -= [:active_record]
  config.gem 'mongoid'
  config.time_zone = 'UTC'
end
</pre>
<p>Quando utilizavamos o ActiveRecord, por padrão ele procurava um arquivo <a href="http://www.yaml.org">YAML</a> chamado <em>database.yml</em> no qual continha as informações sobre o meu banco. No caso do mongoid, podemos continuar com esse mesmo arquivo, ou criar outro (no meu caso eu prefiro criar um chamado mongoid.yml).<br />
Abaixo segue o meu arquivo yml:</p>
<pre class="brush: plain;">
base: &amp;base
  adapter: mongodb
  # em tempo de execucao vamos adicionar o &quot;-#{Rails.env}&quot; ao nomo do banco
  database: &quot;feedse&quot;
# Se estiver rodando o mongodb em outro host,
#vc deveria autenticar-se
  #host: host.mongodb.com
  #username: your-username
  #password: your-password

# use as proximas linhas para colocar algo especifico a cada ambiente
development:
  &lt;&lt;: *base

test:
  &lt;&lt;: *base

production:
  &lt;&lt;: *base
</pre>
<p>Feito isso, agora precisamos que nossa aplicação leia esse arquivo e configure nossa conexão com o banco. Para isso, criaremos um arquivo chamado &#8216;mongo.rb&#8217; (ou qualquer outro nome que você queira) dentro do diretório <em>config/initializers</em>.<br />
<strong>mongo.rb</strong></p>
<pre class="brush: ruby;">
require 'yaml'

mongo_config = YAML::load(File.read(File.join(Rails.root, 'config/mongoid.yml')))[Rails.env]

Mongoid.configure do |config|
  config.from_hash(mongo_config)
end
</pre>
<p>Com isso, já temos tudo pronto em relação ao nosso banco.</p>
<p>Criaremos então, um model chamado &#8216;Content&#8217;. Lembrando que como não utilizamos mais o ActiveRecord, nossa classe não deverá herdar <em>ActiveRecord::Base</em>.</p>
<p>Abaixo segue a implementação da nossa classe:</p>
<pre class="brush: ruby;">
class Content
  include Mongoid::Document
  field :title, :type =&gt; String

  validates_presence_of :title
  validates_uniqueness_of :title
end
</pre>
<p>Para que nossa classe seja persistida em nossa banco, precisamos incluir o <em>include Mongoid::Document</em>. Precisamos também definir os campos que ele vai ter, no nosso caso somente o campo &#8216;title&#8217;. A definição básica dos campos segue a seguinte estrutura &#8216;field <nome>, :type => <tipo>&#8216;. Para mais informações consulte a <a href="http://mongoid.org/docs/documents/">documentação do mongoid</a>.</p>
<p><strong>Utilizando o RSpec</strong></p>
<p>Vamos gerar a estrutura do rspec, como faríamos em qualquer outro projeto Rails.</p>
<p>script/generate rspec</p>
<p>Logo após gerar a estrutura, abra o arquivo <em>spec_helper.rb</em> dentro do diretório <em>spec</em> recém gerado, e dentro do bloco <em>Spec::Runner.configure</em> comente as seguinte linhas:</p>
<pre class="brush: ruby;">
  config.use_transactional_fixtures = true
  config.use_instantiated_fixtures  = false
  config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
</pre>
<p>Um dos problemas que enfrentei logo quando comecei a mexer com Rspec junto com MongoDb, foi que o rpspec não limpa o banco de testes após executar os mesmos. Logo isso deverá ser feito na mão, para isso adicionaremos dentro do bloco <em>Spec::Runner.configure</em> em o seguinte código:</p>
<pre class="brush: ruby;">
  config.after(:each) do
    Mongoid.database.collections.each do |collection|
      unless collection.name =~ /^system\./
        collection.remove
      end
    end
  end
</pre>
<p>Deixando o nosso <em>spec_helper.rb</em> assim:</p>
<pre class="brush: ruby;">
ENV[&quot;RAILS_ENV&quot;] ||= 'test'
require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment'))
require 'spec/autorun'
require 'spec/rails'

# in ./support/ and its subdirectories.
Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}

Spec::Runner.configure do |config|

  #config.use_transactional_fixtures = true
  #config.use_instantiated_fixtures  = false
  #config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
  #clean database mongodb after tests
  config.after(:each) do
    Mongoid.database.collections.each do |collection|
      unless collection.name =~ /^system\./
        collection.remove
      end
    end
  end

end
</pre>
<p>Nesse caso o Rspec irá limpar o banco depois de cada teste &#8216;each&#8217;, mas você pode efetuar a limpeza somente depois de todos os testes terem rodado, nesse caso ao invés de &#8216;:each&#8217; como parâmetro, utilizaremos &#8216;:suite&#8217;, e caso você queira executar alguma coisa antes dos testes, utilize o &#8216;config.before&#8217;, que funciona exatamente da mesma maneira do &#8216;config.after&#8217;, com a diferença de ser executado antes(before) dos testes. </p>
<p>Obs: Se você está utilizando também o cucumber e está com problemas em relação a limpeza do banco após os testes, a solução é simples.<br />
Crie o arquivo &#8216;clean_mongo.rb&#8217; (ou qualquer outro nome) dentro de <em>features/support</em> e adicione nele o código abaixo:</p>
<pre class="brush: ruby;">
After do |scenario|
  Mongoid.database.collections.each do |collection|
    unless collection.name =~ /^system\./
      collection.remove
    end
  end
end
</pre>
<p>E com isso temos nossos testes funcionando com o mongodb.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=307</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pesquisa avançada com MongoMapper, simulando um “like %”</title>
		<link>http://www.lucasallan.com/?p=300</link>
		<comments>http://www.lucasallan.com/?p=300#comments</comments>
		<pubDate>Tue, 03 Aug 2010 16:53:51 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[Mongodb]]></category>
		<category><![CDATA[NoSql]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[MongoMapper]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=300</guid>
		<description><![CDATA[Esse post é uma &#8220;continuação&#8221; do anterior, estarei demonstrando como fazer uma query no &#8220;like %&#8221; no MongoDb, utilizando a gem MongoMapper Como no post anterior, eu tenho o model &#8220;Person&#8221;: class Person include MongoMapper::Document key :name, String key :middle_initial, String end E eu preciso encontrar todos os registros (no caso do Mongodb, documentos) que [...]]]></description>
			<content:encoded><![CDATA[<p>Esse post é uma &#8220;continuação&#8221; do <a href="http://www.lucasallan.com/?p=295">anterior</a>, estarei demonstrando como fazer uma query no &#8220;like %&#8221; no <a href="http://www.mongodb.org/">MongoDb</a>, utilizando a gem <a href="http://github.com/jnunemaker/mongomapper">MongoMapper</a></p>
<p>Como no post anterior, eu tenho o model &#8220;Person&#8221;:</p>
<pre class="brush: ruby;">
class Person
  include MongoMapper::Document
  key :name, String
  key :middle_initial, String
end
</pre>
<p>E eu preciso encontrar todos os registros (no caso do Mongodb, documentos) que contenham o nome “Silva” em ‘name’, podendo ter vários Silva’s, como: “João da Silva”, “Maria Silva” e etc…</p>
<p>A solução, mais uma vez, é simples:</p>
<pre class="brush: ruby;">
Person.all(&quot;$where&quot; =&gt; &quot;function() { return this.name.match(/&quot;Silva&quot;/i)&quot;})
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=300</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pesquisa avançada com Mongoid, simulando um &#8220;like %&#8221;</title>
		<link>http://www.lucasallan.com/?p=295</link>
		<comments>http://www.lucasallan.com/?p=295#comments</comments>
		<pubDate>Sun, 01 Aug 2010 21:51:42 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[Mongodb]]></category>
		<category><![CDATA[NoSql]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[mongoid]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=295</guid>
		<description><![CDATA[Comecei semana passada a utilizar o Mongodb (utilizando a biblioteca mongoid) em um novo projeto que estou desenvolvendo. Embora a documentação do Mongoid seja excelente, tive problemas para utilizar uma query com o &#8216;like %%&#8217; de pesquisa como eu utilizava em bancos de dados relacionais. A solução que eu encontrei foi utilizar uma Regex no [...]]]></description>
			<content:encoded><![CDATA[<p>Comecei semana passada a utilizar o <a href="http://www.mongodb.org/">Mongodb</a> (utilizando a biblioteca <a href="http://mongoid.org">mongoid</a>) em um novo projeto que estou desenvolvendo. Embora a documentação do Mongoid seja excelente, tive problemas para utilizar uma query com o &#8216;like %%&#8217; de pesquisa como eu utilizava em <a href="http://pt.wikipedia.org/wiki/Banco_de_dados_relacional">bancos de dados relacionais</a>.<br />
A solução que eu encontrei foi utilizar uma Regex no parâmetro de busca.<br />
Imagine que eu tenho um model chamado Person, como o abaixo:</p>
<pre class="brush: ruby;">
class Person
  include Mongoid::Document
  field :name
  field :middle_initial
end
</pre>
<p>E eu preciso encontrar todos os registros (no caso do Mongodb, documentos) que contenham o nome &#8220;Silva&#8221; em &#8216;name&#8217;, podendo ter vários Silva&#8217;s, como: &#8220;João da Silva&#8221;, &#8220;Maria Silva&#8221; e etc&#8230;</p>
<p>A solução é simples:</p>
<pre class="brush: ruby;">
Person.find(:all, :conditions =&gt; {:name =&gt; Regexp.new(&quot;Silva&quot;)}).entries
</pre>
<p>Então será retornado um array contendo todos os documentos com o termo &#8220;Silva&#8221; no nome.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=295</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Iniciando no desenvolvimento de aplicações Desktop com Qt e Ruby</title>
		<link>http://www.lucasallan.com/?p=287</link>
		<comments>http://www.lucasallan.com/?p=287#comments</comments>
		<pubDate>Mon, 26 Jul 2010 17:36:19 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[QT]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=287</guid>
		<description><![CDATA[Esse post é o inicio de uma série que estou preparando sobre desenvolvimento desktop com Ruby. Para quem não sabe o Qt é um framework para desenvolvimento de aplicações Desktop muito utilizado pelo comunidade OpenSource. E já provou sua eficácia em grandes projetos. Foi desenvolvido originalmente pela empresa e mais tarde adquirido pela Nokia. Nesse [...]]]></description>
			<content:encoded><![CDATA[<p>Esse post é o inicio de uma série que estou preparando sobre desenvolvimento desktop com Ruby. Para quem não sabe o <a href="http://qt.nokia.com/products/">Qt</a> é um framework para desenvolvimento de aplicações Desktop muito utilizado pelo comunidade OpenSource. E já provou sua eficácia em <a href="http://www.kde.org/">grandes projetos</a>. Foi desenvolvido originalmente pela empresa e mais tarde adquirido pela <a href="http://www.nokia.com/">Nokia</a>. Nesse exemplo, será desenvolvido uma simples aplicação &#8220;Hello World!&#8221; e no futuro aprofundaremos mais no assunto.</p>
<pre class="brush: ruby;">
require 'Qt4'

app = Qt::Application.new(ARGV)

hello = Qt::PushButton.new('Hello World!')
hello.resize(100, 30)
hello.show()

app.exec()
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=287</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilizando o is_paranoid</title>
		<link>http://www.lucasallan.com/?p=282</link>
		<comments>http://www.lucasallan.com/?p=282#comments</comments>
		<pubDate>Sun, 13 Jun 2010 15:51:03 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[is_paranoid]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=282</guid>
		<description><![CDATA[O is_paranoid é uma gem que faz com que os registros do banco não sejam apagados através do método destroy. Ao chamar o método destroy nosso objeto é apenas marcado como apagado e pode ser restaurado posteriormente, bem como listado através de método fornecidos pelo is_paranoid. Sua utilização é bem simples, primeiro instale a gem: [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://github.com/semanticart/is_paranoid">is_paranoid</a> é uma gem que faz com que os registros do banco não sejam apagados através do método <em>destroy</em>. Ao chamar o método <em>destroy </em> nosso objeto é apenas marcado como apagado e pode ser restaurado posteriormente, bem como listado através de método fornecidos pelo is_paranoid.<br />
Sua utilização é bem simples, primeiro instale a gem:</p>
<p style="padding-left: 30px;">gem install is_paranoid</p>
<p>Para que funcione em sua aplicação Rails, adicione no <em>enviroment.rb , dentro do bloco de inicialização:</em></p>
<pre class="brush: ruby;">
config.gem &quot;is_paranoid&quot;
</pre>
<p>Deixando mais ou menos assim:</p>
<pre class="brush: ruby;">
Rails::Initializer.run do |config|
  # ...
  config.gem &quot;is_paranoid&quot;
end
</pre>
<p>Agora, nos models que vão utilizar dos recursos do is_paranoid, adicione logo após a declaração da classe &#8216;is_paranoid&#8217;</p>
<p>Exemplo:</p>
<pre class="brush: ruby;">
class Student &lt; ActiveRecord::Base
  is_paranoid
end
</pre>
<p>E para finalizar, crie uma migrate que adicione na tabela que vai utilizar o is_paranoid, o campo &#8216;deleted_at&#8217;, do tipo &#8216;timestamp&#8217;.</p>
<p>Exemplo:</p>
<pre class="brush: ruby;">
class AddIsparanoidInStudent &lt; ActiveRecord::Migration
  def self.up
    add_column :students, :deleted_at, :timestamp
  end

  def self.down
    remove_column :students, :deleted_at
  end
end
</pre>
<p>Pronto! Se quiser saber mais sobre o is_paranoid, consulte a documentação oficial no site do projeto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=282</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Remember password com restful_authentication</title>
		<link>http://www.lucasallan.com/?p=273</link>
		<comments>http://www.lucasallan.com/?p=273#comments</comments>
		<pubDate>Sat, 10 Apr 2010 15:25:38 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[restful_authentication]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=273</guid>
		<description><![CDATA[O restful_authentication é um plugin de autenticação para aplicativos ruby on rails, com excelentes recursos, super fácil de configurar. Enfim, não vou falar muito sobre ele, pois não é o propósito desse tutorial. Irei assumir que você já tem o restful_authentication funcionando e quer apenas adicionar a funcionalidade de enviar um código de reset password [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://github.com/technoweenie/restful-authentication">restful_authentication</a> é um plugin de autenticação para aplicativos ruby on rails, com excelentes recursos, super fácil de configurar. Enfim, não vou falar muito sobre ele, pois não é o propósito desse tutorial. Irei assumir que você já tem o restful_authentication funcionando e quer apenas adicionar a funcionalidade de enviar um código de reset password via email para o usuário que esqueceu sua senha. Ao acessar o link com esse código o sistema irá exibir uma tela de troca de senha,  lembrando que esse código deverá ser único e poderá ser usado somente uma vez. Então vamos lá:</p>
<p>Primeiro iremos gerar uma migration que adiciona na tabela o usuário a coluna &#8216;reset_password_code&#8217;.</p>
<p>script/generate migration reset_password_code</p>
<p>Agora editarei a migration gerada, deixando da seguinte forma:</p>
<pre class="brush: ruby;">
class ResetPasswordCode &lt; ActiveRecord::Migration
  def self.up
    add_column :users, :reset_password_code, :string
  end

  def self.down
    remove_column :users, :reset_password_code
  end
end
</pre>
<p>em seguida, &#8216;rake db:migration&#8217; e estaremos pronto para começar!</p>
<p>Na classe UsersController irei criar um método protected que irá gerar um código para ser enviado ao usuário.</p>
<pre class="brush: ruby;">
protected
  def random_code( len = 40 )
    chars = ((&quot;a&quot;..&quot;z&quot;).to_a + (&quot;1&quot;..&quot;9&quot;).to_a )- %w(i o 0 1 l 0)
    newpass = Array.new(len, '').collect{chars[rand(chars.size)]}.join
  end
</pre>
<p>Agora criarei o método que chamará a view com o campo para o usuário colocar seu email:</p>
<pre class="brush: ruby;">
  def change_reset_password
  end
</pre>
<p>Agora criarei a view que receberá o endereço de email do usuário e chamará o método &#8220;reset_password&#8221; passando o email:</p>
<pre class="brush: ruby;">
&lt;p&gt;
    &lt;%= form_tag (:controller =&gt; 'users', :action =&gt; 'reset_password' ) %&gt;

    &lt;p&gt;
        &lt;%= label_tag 'Email' %&gt;
        &lt;br/&gt;
        &lt;%= text_field_tag (:email) %&gt;
    &lt;/p&gt;
    &lt;p&gt;
        &lt;%= submit_tag 'Enviar' %&gt;
    &lt;/p&gt;
    &lt;%= flash[:alert] %&gt;
&lt;/p&gt;
</pre>
<p>Já método reset_password, irá receber o email, procurar o usuário com esse email, gerar o código de reset password, e chamar o UserMailer para enviar o email com o código.</p>
<pre class="brush: ruby;">
  def reset_password
    user = User.find_by_email(params[:email])
    unless user.nil?
      user.reset_password_code = random_code
      if user.save!
        UserMailer.deliver_new_password(user)
        flash[:done] = &quot;Verifique seu email para trocar a senha&quot;
        redirect_to ('/')
      else
        flash[:error] = &quot;Erro ao efetuar trocar de senha&quot;
        render :action =&gt; 'change_reset_password'
      end
    else
      flash[:error]  = &quot;Email Inválido&quot;
      render :action =&gt; 'change_reset_password'
    end
  end
</pre>
<p>Vejam que estou chamando &#8220;UserMailer.deliver_new_password(user)&#8221; e passando o usuário como parâmetro. Na classe &#8216;UserMailer&#8217; devo criar o método &#8216;new_password&#8217; que será usado para enviar o email.<br />
Meu método new_password deverá ficar assim:</p>
<pre class="brush: ruby;">
  def new_password(user)
    setup_email(user)
    @subject    += 'Mudança de senha'
    @body[:url]  = &quot;#{$SERVER_CONTENT_BASE}/password/#{user.reset_password_code}&quot;
  end
</pre>
<p>Agora criarei a view para esse email, dentro de &#8216;app/views/user_mailer&#8217; com o nome de &#8216;new_password.html.erb&#8217;</p>
<pre class="brush: ruby;">
Olá &lt;%=h @user.login %&gt; alguém solicitou a troca de senha para essa conta.
Se deseja realmente trocar sua senha, clique no link abaixo:
&lt;%=h @url %&gt;
</pre>
<p>Agora de volta ao UsersController, criarei o método que recebe o reset_code e se ele estiver correto será jogado em um campo hidden na view de troca de senha.</p>
<pre class="brush: ruby;">
  def code_password_reset
    user = User.find_by_reset_password_code(params[:reset_code])
    if user.nil?
      flash[:error]  = &quot;Código inválido&quot;
      redirect_to ('/')
    else
      @reset_code = params[:reset_code]
      render :action =&gt; &quot;new_password&quot;
    end
  end
</pre>
<p>Criarei a view de troca de senha, chamada &#8216;new_password&#8217;</p>
<pre class="brush: ruby;">
&lt;p&gt;
    &lt;%= form_tag (:controller =&gt; 'users', :action =&gt; 'reset_password_update', :method =&gt; 'put' ) %&gt;
    &lt;p&gt;
        &lt;%= label_tag 'Nova Senha' %&gt;
        &lt;br/&gt;
        &lt;%= password_field_tag (:password) %&gt;
    &lt;/p&gt;
    &lt;p&gt;
        &lt;%= label_tag 'Confirmação' %&gt;
        &lt;br/&gt;
        &lt;%= password_field_tag (:password_confirmation) %&gt;
    &lt;/p&gt;
    &lt;%= hidden_field_tag(:reset_code, @reset_code) %&gt;
    &lt;p&gt;
        &lt;%= submit_tag 'Enviar' %&gt;
    &lt;/p&gt;
	&lt;%= flash[:alert]%&gt;
&lt;/p&gt;
</pre>
<p>E agora o método que de fato executa a troca de senha:</p>
<pre class="brush: ruby;">
  def reset_password_update
    @user = User.find_by_reset_password_code(params[:reset_code]) unless params[:reset_code].blank?
    if ((params[:password] == params[:password_confirmation]) &amp;&amp; !params[:password_confirmation].blank?)
       @user.password_confirmation = params[:password_confirmation]
       @user.password = params[:password]
       @user.reset_password_code = nil
      if @user.save!
        flash[:done] = &quot;Senha atualizada com sucesso!&quot;
        redirect_to (&quot;/&quot;)
      else
        flash[:alert] = &quot;Falha ao atualizar senha.&quot;
        render :action =&gt; 'new_password'
      end
    else
      flash[:alert] = &quot;Senhas diferentes!&quot;
      render :action =&gt; 'new_password'
   end
  end
</pre>
<p>Para finalizar iremos configurar as rotas;</p>
<pre class="brush: ruby;">
  map.resources :users, :collection =&gt; { :change_reset_password =&gt; :get,
                                         :new_password =&gt; :get, :reset_password_update =&gt; :post,
                                         :code_password_reset =&gt; :get, :reset_password =&gt; :get}
  map.connect 'password/:reset_code', :controller =&gt; 'users', :action =&gt; 'code_password_reset'
</pre>
<p>E assim chegamos ao fim desse tutorial.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=273</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Teste em ruby utilizando o RSpec</title>
		<link>http://www.lucasallan.com/?p=266</link>
		<comments>http://www.lucasallan.com/?p=266#comments</comments>
		<pubDate>Fri, 05 Mar 2010 03:37:28 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=266</guid>
		<description><![CDATA[Essa semana comecei a utilizar o rspec para realizar testes na aplicação que estou trabalhando e estou gostando muito, pra não dizer que estou viciado. O Rspec torna o trabalho de escrever testes divertido, rápido e prático. Abaixo segue o link de alguns excelentes artigos que tive a chance de ler sobre rspec: http://blog.wolfman.com/articles/2007/7/6/rspec-testing-views-for-escaped-html http://www.elevatedrails.com/articles/2007/09/10/testing-controllers-with-rspec/http://simplesideias.com.br/usando-o-rspec-para-testar-sua-aplicacao-rails-modelos/http://simplesideias.com.br/7-coisas-que-voce-precisa-conhecer-no-rspec/http://blog.davidchelimsky.net/2007/05/14/an-introduction-to-rspec-part-i/]]></description>
			<content:encoded><![CDATA[<p>Essa semana comecei a utilizar o <a href="http://rspec.info/">rspec</a> para realizar testes na aplicação que estou trabalhando e estou gostando muito, pra não dizer que estou viciado. O Rspec torna o trabalho de escrever testes divertido, rápido e prático.<br />
Abaixo segue o link de alguns excelentes artigos que tive a chance de ler sobre rspec:</p>
<p><a href="http://blog.wolfman.com/articles/2007/7/6/rspec-testing-views-for-escaped-html">http://blog.wolfman.com/articles/2007/7/6/rspec-testing-views-for-escaped-html</a><br />
<a href="http://www.elevatedrails.com/articles/2007/09/10/testing-controllers-with-rspec/">http://www.elevatedrails.com/articles/2007/09/10/testing-controllers-with-rspec/</a><br/><a href="http://simplesideias.com.br/usando-o-rspec-para-testar-sua-aplicacao-rails-modelos/">http://simplesideias.com.br/usando-o-rspec-para-testar-sua-aplicacao-rails-modelos/</a><br/><a href="http://simplesideias.com.br/7-coisas-que-voce-precisa-conhecer-no-rspec/">http://simplesideias.com.br/7-coisas-que-voce-precisa-conhecer-no-rspec/</a><br/><a href="http://blog.davidchelimsky.net/2007/05/14/an-introduction-to-rspec-part-i/">http://blog.davidchelimsky.net/2007/05/14/an-introduction-to-rspec-part-i/</a><br/><a href="http://www.elevatedrails.com/articles/2007/09/10/testing-controllers-with-rspec/"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=266</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Paginação no Rails usando o will_paginate</title>
		<link>http://www.lucasallan.com/?p=259</link>
		<comments>http://www.lucasallan.com/?p=259#comments</comments>
		<pubDate>Sat, 20 Feb 2010 16:21:50 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[paginação]]></category>
		<category><![CDATA[will_paginate]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=259</guid>
		<description><![CDATA[Uma maneira fácil de se trabalhar com paginação no Ruby on Rails é utilizar o plugin will_paginate. Nesse breve artigo irei demonstrar como instalar e utilizar em sua aplicação. Primeiro instalaremos o plugin: gem install will_paginate Com o plugin instalado, podemos começar a configura-lo na aplicação. Para isso abra o arquivo environment.rb dentro do diretório [...]]]></description>
			<content:encoded><![CDATA[<p>Uma maneira fácil de se trabalhar com paginação no Ruby on Rails é utilizar o plugin <a href="http://wiki.github.com/mislav/will_paginate/">will_paginate</a>. Nesse breve artigo irei demonstrar como instalar e utilizar em sua aplicação.<br />
Primeiro instalaremos o plugin:</p>
<p>gem install will_paginate</p>
<p>Com o plugin instalado, podemos começar a configura-lo na aplicação. Para isso abra o arquivo <i>environment.rb</i> dentro do diretório <i>config</i> e adicione no final do arquivo a seguinte linha:</p>
<pre class="brush: ruby;">
require &quot;will_paginate&quot;
</pre>
<p>Com isso, sua aplicação só irá subir se o plugin will_paginate estiver presente.<br />
Já no controlador devo usar o método paginate para efetuar a busca pelos registros no banco. No meu caso, tenho uma entidade chamada &#8216;noticia&#8217; e no método &#8216;index&#8217; do seu controlador, pelo padrão o rails faz uma busca por todos os registros no banco.</p>
<pre class="brush: ruby;">
  def index
    @noticias = Noticia.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render : xml =&gt; @noticias }
    end
</pre>
<p>E no caso eu irei deixa-lo assim:</p>
<pre class="brush: ruby;">
  def index
    @noticias = Noticia.paginate :page =&gt; params[:page], : order =&gt; 'created_at DESC', :per_page =&gt; 10

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render : xml =&gt; @noticias }
    end
  end
</pre>
<p>Onde o &#8220;:order =>&#8221; irá definir a ordem de exibição dos registros.<br />
E o &#8220;:per_page =>&#8221; a quantidade de registros por página.</p>
<p>E pra terminar, abra a view e adicione logo abaixo do término da tabela:</p>
<pre class="brush: ruby;">
&lt;%= will_paginate @noticias %&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=259</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sobre o Zend Framework</title>
		<link>http://www.lucasallan.com/?p=255</link>
		<comments>http://www.lucasallan.com/?p=255#comments</comments>
		<pubDate>Fri, 08 Jan 2010 18:24:10 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=255</guid>
		<description><![CDATA[Pessoal, para quem programa em PHP e quer conhecer o framework Zend ou conhece e quer se aprofundar, o meu grande amigo Fernando está publicando em seu blog uma série de exemplos de utilização do Zend. Vale a pena dá uma conferida. Insert Zend Framework Enviando e-mails com SMTP autenticado e corpo HTML através do [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal, para quem programa em <a href="http://pt.wikipedia.org/wiki/PHP">PHP</a> e quer conhecer o <a href="http://pt.wikipedia.org/wiki/Framework">framework</a> <a href="http://pt.wikipedia.org/wiki/Zend_Framework">Zend</a> ou conhece e quer se aprofundar, o meu grande amigo <a href="http://twitter.com/fisholito">Fernando</a> está publicando em seu <a href="http://fish.jpa.com.br/">blog</a> uma série de exemplos de utilização do <a href="http://pt.wikipedia.org/wiki/Zend_Framework">Zend</a>. Vale a pena dá uma conferida.</p>
<p><a href="http://fish.jpa.com.br/2009/insert-zend-framework/">Insert Zend Framework</a><br />
<a href="http://fish.jpa.com.br/2009/enviando-e-mails-com-smtp-autenticado-e-corpo-html-atraves-do-zend_mail/">Enviando e-mails com SMTP autenticado e corpo HTML através do Zend_Mail</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=255</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSF utilizando o SelectOneMenu de maneira fácil</title>
		<link>http://www.lucasallan.com/?p=251</link>
		<comments>http://www.lucasallan.com/?p=251#comments</comments>
		<pubDate>Tue, 05 Jan 2010 03:49:10 +0000</pubDate>
		<dc:creator>Lucas</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://www.lucasallan.com/?p=251</guid>
		<description><![CDATA[Um das principais fontes de dúvida para quem está começando a aprender JSF é o componente SelectOneMenu. Basta uma simples garimpada no google e você confirmará isso. Diversas soluções para o uso do SelectOneMenu são indicadas, uma das que mais vejo é utilizar um converter para converter o objeto selecionada na SelectOneMenu no objeto desejado. [...]]]></description>
			<content:encoded><![CDATA[<p>Um das principais fontes de dúvida para quem está começando a aprender JSF é o componente SelectOneMenu. Basta uma simples garimpada no google e você confirmará isso. Diversas soluções para o uso do SelectOneMenu são indicadas, uma das que mais vejo é utilizar um converter para converter o objeto selecionada na SelectOneMenu no objeto desejado. Porém eu prefiro uma maneira que acho mais simples, que irei mostrar a seguir.<br />
No nosso exemplo, terei um objeto do tipo &#8220;Classe&#8221; que representará uma classe de alunos, cada classe contem um objeto do tipo &#8220;Professor&#8221;. Ao cadastrar uma classe o usuário deverá selecionar o professor em uma determinada lista. Então vamos lá:</p>
<p>Teremos um backing bean chamado ClasseBean que conterá uma objeto do tipo classe.</p>
<pre class="brush: java;">
public class ClasseBean {

    private Classe classe;
    private ClasseDao classeDao;
    private List&lt;SelectItem&gt; listaItem;
    private int professorSelecionado;

public ClasseBean() {
        classe = new Classe();
        classeDao = new ClasseDao();
        listaItem = getLista();
    }

 public List&lt;SelectItem&gt; getLista() {
        ArrayList&lt;SelectItem&gt; lista = new ArrayList&lt;SelectItem&gt;();
	ProfessorDao professorDao = new ProfessorDao();
        List&lt;Professor&gt; resultado = (List&lt;Professor&gt;) professorDao.listAll();

        for (Professor teste : resultado) {
            SelectItem item = new SelectItem(teste.getId(), teste.getNome());
            lista.add(item);
        }
        return lista;
    }

 public String salvar() {

	 ProfessorDao professorDao = new ProfessorDao();
         professor = professorDao.procurar(professorSelecionado);
         this.classe.setProfessor(professor);
         classeDao.salvar(classe);

        classe = new Classe();
        return &quot;listarClasses&quot;;
    }

	//métodos getters e setters omitidos

}
</pre>
<p>No exemplos não irei me apegar a camada de persistência, devendo essa ter sido criada previamente pelo programador e conter os métodos de busca pelo ID e buscar todos os registros.</p>
<p>Iremos começar pelo método <b>getLista()</b>, nesse método é criado uma lista de SelectItem que será usada como exibição, os objetos <i><b>SelectItem</i></b> recebem como parametro no construtor dois atributos, o primeiro é a chave do selectItem (que será igual ao id do professor) e o valor de exibição (que no nosso caso será o nome do professor).</p>
<p>Já o método <b>salvar()</b> utilizar o ProfessorDao para efetuar uma busca através do atributo professorSelecionado (o valor desse atributo será igual a chave do item escolhido no SelectOneMenu, que no nosso caso será o id do professor. Lembra-se do: <i>&#8220;SelectItem item = new SelectItem(teste.getId(), teste.getNome());&#8221;</i> ) após isso o atributo professor do objeto Classe é setado e o o objeto é persistido.</p>
<p>Agora iremos para a criação da página jsf:</p>
<pre class="brush: xml;">
&lt;h:selectOneMenu value=&quot;#{classeBean.professorSelecionado}&quot;&gt;
classeBean.listaItem}&quot;&gt;
                            &lt;f:selectItems value=&quot;#{classeBean.listaItem}&quot;/&gt;
&lt;/h:selectOneMenu&gt;
</pre>
<p>O atributo <i>value</i> do SelectOneMenu recebe como parametro o atributo que receberá o valor da chave do atributo selecionado da lista.<br />
E utilizamos o <b>selectItems</b> para informar em qual atributo está a lista de SelectItem&#8217;s a ser exibida.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lucasallan.com/?feed=rss2&amp;p=251</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
