<?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:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Apuntes de Rails</title>
    <link>http://apuntesderails.amaiac.net</link>
    <language>es</language>
    <webMaster>amaia@amaiac.net (Amaia)</webMaster>
    <copyright>Copyright 2007-2009</copyright>
    <ttl>60</ttl>
    <pubDate>Wed, 24 Jun 2009 19:01:51 GMT</pubDate>
    <description>y de otras cosas</description>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ApuntesDeRails" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Borrar sesiones viejas en Rails 2.3 con ActiveRecordStore</title>
      <link>http://apuntesderails.amaiac.net/archives/2009/6/24/borrar_sesiones_viejas_en_rails/</link>
      <pubDate>Wed, 24 Jun 2009 18:59:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2009/6/24/borrar_sesiones_viejas_en_rails/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;Tarea rake para borrar las sesiones que no se han utilizado en las ultimas 3 horas. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;desc "Borrar de la base de datos la sesiones que han expirado ."
task :delete_old_sessions =&amp;gt; :environment do
 sesiones = ActiveRecord::SessionStore::Session.find(:all, :conditions =&amp;gt; ['updated_at &amp;lt; ?', 3.hours.ago])
 sesiones.each {|s| s.delete}
end
&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/bmwOPljzbL4" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/rails">rails</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/rake">rake</category>
    </item>
    <item>
      <title>Instalación de Feedzirra en Ubuntu 8.04</title>
      <link>http://apuntesderails.amaiac.net/archives/2009/5/15/instalacion_de_feedzirra_en_ubuntu/</link>
      <pubDate>Sat, 16 May 2009 01:14:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2009/5/15/instalacion_de_feedzirra_en_ubuntu/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;&lt;a href="http://www.pauldix.net/2009/02/feedzirra-a-ruby-feed-library-built-for-speed.html"&gt;Feedzirra&lt;/a&gt; en un parser de feeds muy rápido, &lt;a href="http://www.pauldix.net/2009/01/sax-machine-sax-parsing-made-easy.html"&gt;basado en nokogiri y libxml&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Primero hay que instalar nokogiri:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo aptitude install libxslt-dev libxml2 libxml2-dev
sudo gem install nokogiri
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;y luego feedzirra:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install libcurl4-openssl-dev
sudo gem install pauldix-feedzirra -s http://gems.github.com
&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/crddPCvj3GE" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/feeds">feeds</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/feedzirra">feedzirra</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/ubuntu">ubuntu</category>
    </item>
    <item>
      <title>Instalción de Rails y Passenger en Ubuntu 8.04 (Hardy)</title>
      <link>http://apuntesderails.amaiac.net/archives/2009/3/11/instalción_de_rails_y_passenger_en _ubuntu_8_04/</link>
      <pubDate>Wed, 11 Mar 2009 13:37:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2009/3/11/instalción_de_rails_y_passenger_en _ubuntu_8_04/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;Instalación de &lt;code&gt;ruby&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install build-essential 
sudo apt-get install ruby rdoc ri irb libopenssl-ruby1.8 ruby1.8-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instalación de &lt;code&gt;rubygems&lt;/code&gt; desde las fuentes, porque los paquetes para Ubuntu no están disponibles para la última versión:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /usr/local/src/
sudo wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
sudo tar xzfv rubygems-1.3.1.tgz
cd rubygems-1.3.1
sudo ruby setup.rb

sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ahora puedes borrar los ficheros que has descargado en&lt;code&gt;/usr/local/src/&lt;/code&gt; si quieres.&lt;/p&gt;

&lt;p&gt;Instalación de sqlite3 (opción por defecto a partir de rails 2 para la base de datos):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install sqlite3 libsqlite3-dev
sudo gem install sqlite3-ruby
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instalación de Rails:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install rails
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instalación de apache y mysql:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install apache2 
sudo apt-get install mysql-server mysql-client libmysqlclient15-dev

sudo gem install mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para usar virtual hosts en apache quitar la linea &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NameVirtualHost *
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;de &lt;code&gt;/etc/apache2/sites-available/default&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Cambiar la primera linea por &lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;En &lt;code&gt;/etc/apache2/apache2.conf&lt;/code&gt; poner&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NameVirtualHost *:80

&amp;lt;IfModule mod_ssl.c&amp;gt;
    NameVirtualHost *:443
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;antes de &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
Include /etc/apache2/conf.d/

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Crear &lt;code&gt;/var/www/default&lt;/code&gt; y mover ahí el &lt;code&gt;index.html&lt;/code&gt; que hay en &lt;code&gt;/var/www&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Cambiar el &lt;code&gt;DocumentRoot&lt;/code&gt; de &lt;code&gt;/etc/apache2/sites-available/default&lt;/code&gt; al nuevo directorio.&lt;/p&gt;

&lt;p&gt;Instalación de Passenger (a.k.a mod_rails):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install passenger
sudo passenger-install-apache2-module
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Y seguir las &lt;a href="http://www.modrails.com/install.html"&gt;instrucciones&lt;/a&gt;. No te olvides de poner las tres líneas que te dice Passenger en el fichero de configuración de apache &lt;code&gt;/etc/apache2/apache2.conf&lt;/code&gt; (yo lo pongo antes de lo del VirtualHost del párrafo anterior).&lt;/p&gt;

&lt;p&gt;Otra opción de instalación para Ubuntu Hardy 8.04 es el &lt;a href="http://www.modrails.com/install.html"&gt;paquete que ha hecho BrightBox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Luego en el virtual host para la aplicación Rails pones como &lt;code&gt;DocumentRoot&lt;/code&gt; la ruta al directorio public de la aplicación y ya está. Si quieres afinar más la configuración mírate la &lt;a href="http://www.modrails.com/documentation/Users%20guide.html"&gt;guía de usuario de Passenger&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/968IOtJHgN4" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/apache">apache</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/modrails">modrails</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/passenger">passenger</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/rails">rails</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/ubuntu">ubuntu</category>
    </item>
    <item>
      <title>Euruko 2009 en Barcelona, 9-10 de mayo</title>
      <link>http://apuntesderails.amaiac.net/archives/2008/12/10/euruko_2009_barcelona_9_10_mayo/</link>
      <pubDate>Wed, 10 Dec 2008 21:15:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2008/12/10/euruko_2009_barcelona_9_10_mayo/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;Pues sí, ya tenemos fechas oficiales para la próxima &lt;a href="http://euruko2009.org"&gt;Euruko (European Ruby Conference)&lt;/a&gt;, será el fin de semana del &lt;a href="http://euruko2009.org/archives/2008/12/10/dates_for_euruko_2009"&gt;9-10 de Mayo de 2009 en Barcelona&lt;/a&gt;, en el &lt;a href="http://citilab.eu"&gt;Citilab&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Nos vemos por allí.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/Q_2yvpngxRE" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/euruko">euruko</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/ruby">ruby</category>
    </item>
    <item>
      <title>Actualizar RubyGems a la versión 1.3.1</title>
      <link>http://apuntesderails.amaiac.net/archives/2008/12/2/actualizar_rubygems_a_la_versión/</link>
      <pubDate>Tue, 02 Dec 2008 15:50:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2008/12/2/actualizar_rubygems_a_la_versión/</guid>
      <author>manu@sindominio.net (Manu)</author>
      <description>&lt;p&gt;La versión 1.1 y la 1.2 de RubyGems tienen problemas para actualizarse, si después de ejecutar &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo gem update &amp;mdash;system
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ves un "Nothing to update", prueba a instalar y ejecutar la gema rubygems-update:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo gem install rubygems-update
$ sudo update_rubygems
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Y a correr :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/mFLkFnzxW7c" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/gems">gems</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/tips">tips</category>
    </item>
    <item>
      <title>Cierre del plazo de inscripción para la Conferencia Rails 2008</title>
      <link>http://apuntesderails.amaiac.net/archives/2008/10/30/cierre_del_plazo_de_inscripcion_conferenciarails2008/</link>
      <pubDate>Thu, 30 Oct 2008 16:54:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2008/10/30/cierre_del_plazo_de_inscripcion_conferenciarails2008/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;Como la mayoría ya sabréis, la &lt;a href="http://www.conferenciarails.org/"&gt;Conferencia Rails 2008&lt;/a&gt; será los próximos días 13 y 14 de noviembre en Madrid, en la Escuela de Teleco.&lt;/p&gt;

&lt;p&gt;Para cerrar temas de catering, sobre todo para la cena del jueves, desde el equipo de organización necesitamos cerrar las inscripciones y los pagos el próximo día 5 de noviembre (el &lt;a href="http://www.conferenciarails.org/2008/10/fecha-limite-de-pago-para-la-conferencia-2008/"&gt;día 5&lt;/a&gt; tendría que estar ya el pago en nuestra cuenta), para que de tiempo a organizarlo todo.&lt;/p&gt;

&lt;p&gt;Así que si vas a venir y todavía no te has &lt;a href="http://app.conferenciarails.org/registro"&gt;apuntado&lt;/a&gt;, ¿a qué esperas?
Ya sabemos que estas cosas se suelen dejar para el final, pero
necesitamos tener cerrado el número de asistentes cuanto antes.&lt;/p&gt;

&lt;p&gt;Si lo que pasa es que no lo tienes claro puedes mirar el &lt;a href="http://app.conferenciarails.org/charlas/calendario"&gt;calendario de charlas&lt;/a&gt; y terminar de convencerte de que no te lo puedes perder ;)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/PicE8fjuj2w" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/conferenciarails">conferenciarails</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/conferenciarails2008">conferenciarails2008</category>
    </item>
    <item>
      <title>Migrar los repositorios svn a otro servidor</title>
      <link>http://apuntesderails.amaiac.net/archives/2008/8/12/migrar_los_repositorios_svn/</link>
      <pubDate>Tue, 12 Aug 2008 20:16:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2008/8/12/migrar_los_repositorios_svn/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;Ya sé que lo que más mola ahora es Git, pero de momento en &lt;a href="http://www.dabne.net"&gt;Dabne&lt;/a&gt; seguimos manteniendo nuestros repositorios de código en Subversion, mientras vamos trasteando con Git y valorando si cambiar del todo o seguir con un híbrido de svn + git.&lt;/p&gt;

&lt;p&gt;El caso es que esta semana he tenido que mover los repos a un nuevo servidor y así es cómo lo he hecho. &lt;/p&gt;

&lt;p&gt;En el servidor donde están los repos hay que hacer un 'dump' de cada uno de ellos, copiarlos al servidor 2, y cargarlos en un repo nuevo recién creadito. &lt;/p&gt;

&lt;p&gt;Sería así:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;serv1$ svnadmin dump nombre_repo &amp;gt; nombre_repo.dump
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se copian los ficheros &lt;code&gt;.dump&lt;/code&gt; al servidor 2 y se hace:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;serv2$ svnadmin create nombre_repo
serv2$ svnadmin load nombre_repo &amp;lt; nombre_repo.dump
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como tenía varios he probado a hacerlo con un scriptcillo en ruby directamente desde la línea de comandos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;serv1$ ruby -e "Dir.foreach('.'){|x| system \"svnadmin dump #{x} &amp;gt; #{x}.dump\"}"

serv2$ ruby -e "Dir.glob('*.dump'){|x| system \"svnadmin create #{x.split('.')[0]} \"}"
serv2$ ruby -e "Dir.glob('*.dump'){|x| system \"svnadmin load #{x.split('.')[0]} &amp;lt; #{x} \"}"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si la url del repositorio cambia luego en cada copia de trabajo hay que ejecutar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ svn switch &amp;mdash;relocate url_antigua url_nueva
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cuidado con lo que va delante de &lt;code&gt;relocate&lt;/code&gt; que son dos -, no uno de esos largos.&lt;/p&gt;

&lt;p&gt;Esta vez he configurado el acceso a los repositorios con apache2 por https, pero eso queda para otro post.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/-UE--faV9zo" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/subversion">subversion</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/svn">svn</category>
    </item>
    <item>
      <title>Recuperar contraseñas con restful_authentication</title>
      <link>http://apuntesderails.amaiac.net/archives/2008/4/7/recuperar_contrasenas_con_restful_authentication/</link>
      <pubDate>Tue, 08 Apr 2008 00:41:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2008/4/7/recuperar_contrasenas_con_restful_authentication/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;Continuación del &lt;a href="http://apuntesderails.amaiac.net/archives/2008/4/7/autenticacion_de_usuarios_con_restful_authentication/"&gt;post anterior&lt;/a&gt; para recuperar las contraseñas olvidadas.&lt;/p&gt;&lt;p&gt;Crear una migration para añadir un campo &lt;code&gt;reset_code&lt;/code&gt; al modelo User&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$  script/generate migration password_reset_code
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;
class PasswordResetCode &lt; ActiveRecord::Migration
  def self.up
    add_column "users", "password_reset_code", :string, :limit =&gt; 40
  end

  def self.down
    remove_column "users", "password_reset_code" 
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Añanir los siguientes métodos a &lt;code&gt;app/models/user.rb&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
   def forgot_password
     @forgotten_password = true
     self.make_password_reset_code
   end

   def reset_password
     # First update the password_reset_code before setting the 
     # reset_password flag to avoid duplicate email notifications.
     update_attributes(:password_reset_code =&gt; nil)
     @reset_password = true
   end

   def recently_reset_password?
     @reset_password
   end

   def recently_forgot_password?
     @forgotten_password
   end

  protected

  def make_password_reset_code
     self.password_reset_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Crear los modelos &lt;code&gt;user_notifier.rb&lt;/code&gt; y &lt;code&gt;user_observer.rb&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
# app/models/user_observer.rb
class UserObserver &lt; ActiveRecord::Observer

  def after_save(user)
    UserNotifier.deliver_forgot_password(user) if user.recently_forgot_password?
    UserNotifier.deliver_reset_password(user) if user.recently_reset_password?
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;
# app/models/user_notifier.rb
class UserNotifier &lt; ActionMailer::Base

  def forgot_password(user)
    setup_email(user)
    @subject    += 'Contraseña olvidada'
    @body[:url]  = "#{HOST}/passwords/reset_password/#{user.password_reset_code}" 
  end

  def reset_password(user)
    setup_email(user)
    @subject    += 'Su contraseña ha sido reseteada.'
  end

  protected
  def setup_email(user)
    @recipients  = "#{user.email}"
    @from        = "notifier@midominio.com"
    @subject     = "[midominio.com] "
    @sent_on     = Time.now
    @body[:user] = user
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En &lt;code&gt;app/views/user_notifier/&lt;/code&gt; crear los ficheros &lt;code&gt;forgot_password.html.erb&lt;/code&gt; y &lt;code&gt;reset_password.html.erb&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# app/views/user_notifier/forgot_password.html.erb
&amp;lt;%= @user.login %&amp;gt;, pinche en el enlace para resetear su contraseña

&amp;lt;%= @url %&amp;gt;


# app/views/user_notifier/reset_password.html.erb
&amp;lt;%= @user.login %&amp;gt;, su contraseña ha sido reseteada.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En &lt;code&gt;config/environment.rb&lt;/code&gt; añadir el observer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Activate observers that should always be running
# config.active_record.observers = :cacher, :garbage_collector
config.active_record.observers = :user_observer
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Crear un controlador para gestionar las contrseñas olvidadas y los reseteos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
# app/controllers/passwords_controller.rb
class PasswordsController &lt; ApplicationController

  skip_filter :login_required

  def forgot_password
    return unless request.post?
    if @user = User.find_by_email(params[:email])
      @user.forgot_password
      @user.save
      redirect_to(login_path)
      flash[:notice] = "Hemos envíado un enlace para resetear la contraseña a su correo electrónico." 
    else
      flash[:error] = "No se ha encontrado ningún usuario con esa dirección de correo electrónico." 
    end
  end

  def reset_password 
    return unless request.post?
    @user = User.find_by_password_reset_code(params[:id]) if params[:id]
    if @user.nil? 
      flash[:error] = "Código inválido."
      return
    end
    return if @user unless params[:password]
    begin
      if (params[:password] == params[:password_confirmation])
        @user.password_confirmation = params[:password_confirmation]
        @user.password = params[:password]              
        @user.reset_password
        @user.save!
        flash[:notice] = "Su contraseña ha sido reseteada, ya puede entrar con la nueva contraseña."
        redirect_back_or_default(login_path)                  
      else
        flash[:error] = "Las contraseñas no coinciden."
      end

      rescue ActiveRecord::RecordInvalid
        flash[:error] = "Por favor introduzca información válida."
      end
    end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En &lt;code&gt;app/views/passwords/&lt;/code&gt; &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
# app/views/passwords/forgot_password.html.erb
&lt;p&gt;¿Olvidó su contraseña? &lt;/p&gt;
&lt;% form_tag url_for(:action =&gt; 'forgot_password') do %&gt;
    &lt;p&gt;&lt;label for="email"&gt;Correo electrónico: &lt;/label&gt;&lt;br /&gt;
    &lt;%= text_field_tag :email, "", :size =&gt; 50 %&gt;&lt;/p&gt;
    &lt;p&gt;&lt;%= submit_tag 'Recuperar contraseña' %&gt;&lt;/p&gt;
&lt;% end %&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;
# app/views/passwords/reset_password.html.erb
&lt;p&gt;Resetear contraseña&lt;/p&gt;
&lt;% form_tag url_for(:action =&gt; "reset_password") do %&gt;
    &lt;p&gt;&lt;label for="password"&gt;Contraseña: &lt;/label&gt;&lt;br /&gt;
    &lt;%= password_field_tag :password %&gt;&lt;/p&gt;
    &lt;p&gt;&lt;label for=":password_confirmation"&gt;Confirmar contraseña&lt;/label&gt;&lt;br /&gt;
    &lt;%= password_field_tag :password_confirmation %&gt;&lt;/p&gt;
    &lt;p&gt;&lt;%= submit_tag "Resetear contraseña" %&gt;&lt;/p&gt;    
&lt;% end %&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/6_CZHY_aWGg" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/rails2">rails2</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/restfulauthentication">restfulauthentication</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/tutoriales">tutoriales</category>
    </item>
    <item>
      <title>Autenticación de usuarios con restful_authentication</title>
      <link>http://apuntesderails.amaiac.net/archives/2008/4/7/autenticacion_de_usuarios_con_restful_authentication/</link>
      <pubDate>Mon, 07 Apr 2008 21:55:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2008/4/7/autenticacion_de_usuarios_con_restful_authentication/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;Pasos para crear una aplicación rails con autenticación de usuarios.&lt;/p&gt;

&lt;p&gt;Crear la aplicación rails:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rails myapp
$ cd myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instalar el plugin restful_authentication:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$  script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Generar el sistema de autenticación:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ script/generate authenticated user session
$ rake db:migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En &lt;code&gt;config/routes.rb&lt;/code&gt; añadir lo siguiente antes de las rutas por defecto (las dos últimas)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.resources :users
map.resource  :session, :controller =&amp;gt; 'session'

map.signup '/signup', :controller =&amp;gt; 'users', :action =&amp;gt; 'new'
map.login  '/login', :controller =&amp;gt; 'session', :action =&amp;gt; 'new'
map.logout '/logout', :controller =&amp;gt; 'session', :action =&amp;gt; 'destroy'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En &lt;code&gt;app/controllers/application_controller.rb&lt;/code&gt; poner la línea siguiente, que viene en los controladores &lt;code&gt;user_controller.rb&lt;/code&gt; y &lt;code&gt;session_controller.rb&lt;/code&gt; que ha creado el plugin. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;include AuthenticatedSystem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Poniendolo en &lt;code&gt;application_controller.rb&lt;/code&gt; hacemos que la autenticación esté disponible para todos los controladores.&lt;/p&gt;

&lt;p&gt;Ahora en los controladores para los que queramos restringir el acceso a usuarios autenticados tendremos que poner un filtro:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;before_filter :login_required
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A este filtro le podemos poner parámetros para indicarle que sólo se aplique a algunas acciones o que se aplique a todas excepto a algunas, por ejemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;before_filter :login_required, :only =&amp;gt; [:create, :destroy]
before_filter :login_required, :except =&amp;gt; [:index, :show]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En mi caso últimamente es habitual que necesite controlar el acceso a toda la aplicación salvo a unas pocas acciones por lo que pongo el  &lt;code&gt;before_filter&lt;/code&gt; en &lt;code&gt;application_controller.rb&lt;/code&gt; y luego pongo un &lt;code&gt;skip_before_filter&lt;/code&gt; donde sea necesario, que en este caso es en &lt;code&gt;users_controller.rb&lt;/code&gt; y &lt;code&gt;session_controller.rb&lt;/code&gt; para permitir crear nuevos usuarios y hacer login, que en realidad es crear una nueva session. Por tanto en estos dos controladores pongo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;skip_before_filter :login_required, :only =&amp;gt; [:new, :create]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si además hay una portada de la aplicación pública también habrá que aplicarle esto.&lt;/p&gt;

&lt;p&gt;Para hacer que el registro sea con activación de usuarios por email, ver este &lt;a href="http://apuntesderails.amaiac.net/archives/2007/12/24/restful_authentication_con_activacion_de_usuarios/"&gt;otro post&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/K-HhyKWL7bA" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/restfulauthentication">restfulauthentication</category>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/tutoriales">tutoriales</category>
    </item>
    <item>
      <title>Mostrando el contenido del flash en Rails de forma compacta</title>
      <link>http://apuntesderails.amaiac.net/archives/2008/4/7/mostrando_el_contenido_del_flash/</link>
      <pubDate>Mon, 07 Apr 2008 21:44:00 GMT</pubDate>
      <guid>http://apuntesderails.amaiac.net/archives/2008/4/7/mostrando_el_contenido_del_flash/</guid>
      <author>amaia@amaiac.net (Amaia)</author>
      <description>&lt;p&gt;No me acuerdo de dónde lo copié la primera vez, pero desde entonces ha ido pasando siempre de un proyecto a otro, porque es la forma que más me gusta de hacerlo. &lt;/p&gt;

&lt;p&gt;En &lt;code&gt;app/views/layouts/application.html.erb&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;% flash.each do |key, msg| -%&amp;gt;
  &amp;lt;%= content_tag :div, msg, :class =&amp;gt; key, :id =&amp;gt; 'flash' %&amp;gt;
&amp;lt;% end -%&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Esto crea un div con id &lt;code&gt;flash&lt;/code&gt; y class la clave del hash, que normalmente será &lt;code&gt;error&lt;/code&gt; o &lt;code&gt;notice&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Luego en la css pones los estilos correspondientes y ya queda mucho mejor.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
   #flash {
    padding: 0.5em;
    font-weight: bold;
   }
   .notice {
     background-color: #fff;
     color: #333;
     border: 1px solid green; 
   }
   .error {
     background-color: #ff6666;
     color: #333;
     border: 1px solid red; 
   }

&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/LPk803Np7dg" height="1" width="1"/&gt;</description>
      <category domain="http://apuntesderails.amaiac.net/archives/tags/tips">tips</category>
    </item>
  </channel>
</rss>
