<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Apuntes de Rails]]></title>
  
  <link href="http://apuntesderails.amaiac.net/" />
  <updated>2012-05-20T23:48:45+02:00</updated>
  <id>http://apuntesderails.amaiac.net/</id>
  <author>
    <name><![CDATA[Amaia Castro]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ApuntesDeRails" /><feedburner:info uri="apuntesderails" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[Migrando el blog a Octopress]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/nG3tSQ5FQRw/" />
    <updated>2012-05-20T20:15:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2012/05/20/migrando-el-blog-a-octopress</id>
    <content type="html">&lt;p&gt;Hacía siglos que no escribía en este blog, al principio pensé que era sólo que no tenía nada que escribir,
pero después me di cuenta que una de las cosas que más pereza me daba de ponerme a escribir algo era usar
una interfaz web para publicar, que además iba bastante lenta en el hosting donde tenía el blog.
Había migrado el blog del Simplelog original a Drupal hacía
unos cuantos meses, incluso hice la migración de Drupal 6 a Drupal 7, pero no me decidía a escribir nada.&lt;/p&gt;

&lt;p&gt;Últimantente le he cogido el gustillo a Git como control de verisones y a editar ficheros en Vim
y pensé que me resultaría más cómodo usar un gestor de blogs como &lt;a href="http://octopress.org"&gt;Octopress&lt;/a&gt;
para publicar. En Octopress los posts son ficheros que editas con cualquier editor y el sitio web
se genera como html estático que luego subes a algún sitio, en mi caso a Heroku.
Además puedes ver cómo queda todo en local antes de subirlo al servidor.&lt;/p&gt;

&lt;p&gt;Así que me puse manos a la obra y aquí está el blog con Octopress,
con &lt;a href="http://melandri.net/2012/02/14/octopress-theme-customization/"&gt;un theme de Alessandro Melandri&lt;/a&gt;,
que ya iré modificando más a mi gusto, y los comentarios con &lt;a href="http://disqus.com"&gt;Disqus&lt;/a&gt;,
ya que al pasar a un blog con html estático la gestión de comentarios hay que externalizarla.&lt;/p&gt;

&lt;p&gt;Los comentarios de los posts antiguos los he dejado como comentarios estáticos dentro de cada post,
porque no me parecía buena idea importarlos a Disqus con los datos (p.ej. email) de gente que cuando
hizo el comentario no lo hizo ahí, y yo no soy nadie para darle el email de otra persona a un servicio externo.&lt;/p&gt;

&lt;p&gt;Creo que con este cambio le daré un poco más de vidilla al blog.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/nG3tSQ5FQRw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2012/05/20/migrando-el-blog-a-octopress/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Desactivar servicios en el arranque de Ubuntu]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/xebI0WddoE8/" />
    <updated>2012-05-20T17:39:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2012/05/20/desactivar-servicios-en-el-arranque-de-ubuntu</id>
    <content type="html">&lt;p&gt;Últimamente he instalado muchos servicios nuevos en mi portátil para ir probando, pero que no uso a diario, como PostgreSQL, Redis, MongoDB, CouchDB, etc. y no quiero que se arranquen automáticamente al inicio para que no consuman recursos innecesarios si no los estoy usando. Como siempre google tiene la respuesta y esta vez estaba en &lt;a href="http://superuser.com/a/418012"&gt;http://superuser.com/a/418012&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;   sudo update-rc.d mysql disable 2&lt;/p&gt;

&lt;p&gt;This will rename the sym link to start with &amp;#8216;K&amp;#8217; and the service won&amp;#8217;t start-up on boot. You can then re-enable it at any time if you do decide you want it to start-up on boot.&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/xebI0WddoE8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2012/05/20/desactivar-servicios-en-el-arranque-de-ubuntu/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Presentaciones de la Conferencia Rails 2011]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/THXG4h9KdAs/" />
    <updated>2012-05-20T14:51:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2012/05/20/presentaciones-de-la-conferencia-rails-2011</id>
    <content type="html">&lt;p&gt;Estaba esperando a que se publicasen los vídeos de la Conferencia Rails 2011 para hacer un post con los enlaces, pero como parece que los vídeos se retrasan y que ya no habrá más ediciones de la conferencia, dejo aquí un &lt;a href="https://gist.github.com/1089219"&gt;enlace al gist&lt;/a&gt; en el que recopilé en su momento los enlaces a las presentaciones de las charlas que se dieron.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/THXG4h9KdAs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2012/05/20/presentaciones-de-la-conferencia-rails-2011/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Conferencia Rails 2010]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/V1fvWtmPGhQ/" />
    <updated>2010-11-14T20:34:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2010/11/14/conferencia-rails-2010</id>
    <content type="html">&lt;p&gt;La semana pasada tuvo lugar la 5ª Conferencia Rails, la 4º a la que asisto.&lt;/p&gt;

&lt;p&gt;Este año ha habido &lt;a href="http://conferenciarails.org/2010/schedule.html"&gt;un sólo track&lt;/a&gt; y además la conferencia se ha hecho más internacional y todas las charlas fueron en inglés. Lo de un único track me ha gustado bastante, así no hay dilemas a la hora de escoger a qué charla asistir y supongo que es más fácil para la organización gestionar sólo una sala. Sobre el idioma, a los hispanos prefiero escucharlos en español, pero la verdad es que me da igual, siempre que los ponentes no tengan un acento de esos complicados de pillar (el año pasado hubo un par que me costaba seguir).&lt;/p&gt;

&lt;p&gt;Pronto estarán disponibles los vídeos pero mientras hago &lt;a href="http://apuntesderails.amaiac.net/archives/2010/11/14/conferencia-rails-2010"&gt;aquí&lt;/a&gt; una lista de las slides publicadas hasta ahora para encontrarlas más fácilmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[ACTUALIZACIÓN]&lt;/strong&gt; Videos publicados en http://globalplaza.org/spaces/conferencia-rails/events/conferencia-rails-2010&lt;/p&gt;

&lt;!--more--&gt;


&lt;p&gt;&lt;strong&gt;Charlas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/how_do_i_do_what_i_do_and_why.html"&gt;&lt;strong&gt;How do I do what I do? (and why)&lt;/strong&gt; (Raúl Murciano)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/dexy.html"&gt;&lt;strong&gt;Dexy&lt;/strong&gt; (Ana Nelson)&lt;/a&gt;&lt;br/&gt;
Slides: http://www.slideshare.net/ananelson/dexy-on-rails&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/to_localise_or_not_to_localise.html"&gt;&lt;strong&gt;To Localise or not to Localise, that is the question&lt;/strong&gt; (Elizabeth Sánchez, Carlos Hernández)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/meet_couch_db.html"&gt;&lt;strong&gt;Meet CouchDB&lt;/strong&gt; (Esti Álvarez)&lt;/a&gt;&lt;br/&gt;
Slides: http://www.slideshare.net/estialvarez/meet-couch-db&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/node_js_and_ruby.html"&gt;&lt;strong&gt;Node.js &amp;amp; Ruby&lt;/strong&gt; (Christian Kvalheim)&lt;/a&gt;&lt;br/&gt;
Slides: http://www.slideshare.net/christkv/nodejs-and-ruby&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/derailed_cucumber.html"&gt;&lt;strong&gt;Derailed Cucumber&lt;/strong&gt; (Alan Kennedy &amp;amp; Borja Arias)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/cqrs_diet.html"&gt;&lt;strong&gt;CQRS Diet&lt;/strong&gt; (Luismi Cavallé)&lt;/a&gt;&lt;br/&gt;
Slides: http://www.slideshare.net/cavalle/the-cqrs-diet&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/powerful_ux.html"&gt;&lt;strong&gt;Powerful UX&lt;/strong&gt; (Lori M. Olson)&lt;/a&gt;&lt;br/&gt;
Slides: http://www.slideshare.net/wndxlori/powerful-ux-not-just-for-desktops-anymore&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/geospatial_capabilities_in_ruby.html"&gt;&lt;strong&gt;Geospatial capabilities in Ruby&lt;/strong&gt; (Javier de la Torre, Fernando Blat)&lt;/a&gt;&lt;br/&gt;
Slides: http://www.slideshare.net/jatorre/geospatial-capabilities-on-ruby&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/swallowing_the_pair_programming_pill.html"&gt;&lt;strong&gt;Swallowing the Pair Programming Pill&lt;/strong&gt; (Jim ‘Big Tiger’ Remsik)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/neo4j.html"&gt;&lt;strong&gt;Neo4j&lt;/strong&gt; (Pablo Delgado)&lt;/a&gt;&lt;br/&gt;
Slides: http://www.slideshare.net/pablete/neo4j-for-ruby-and-rails&lt;br/&gt;
Code: https://github.com/pablete/conferenciarails2010&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/html5_websockets_ruby_and_node_js.html"&gt;&lt;strong&gt;HTML5 WebSockets, Ruby and NodeJS&lt;/strong&gt; (Pedro Palazón)&lt;/a&gt;&lt;br/&gt;
Slides (pdf): http://tinyurl.com/37zxoo9&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/documenting_from_the_trenches.html"&gt;&lt;strong&gt;Documenting From The Trenches&lt;/strong&gt; (Xavier Noria)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/simple_data_visualization_with_js.html"&gt;&lt;strong&gt;Simple Data Visualization with JS&lt;/strong&gt; (Eli Kroumova)&lt;/a&gt;&lt;br/&gt;
Slides: https://github.com/elika/code_cr2010/raw/master/slides.pdf&lt;br/&gt;
Code: http://github.com/elika/code_cr2010&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/rails_is_not_enough.html"&gt;&lt;strong&gt;Rails is not Enough&lt;/strong&gt; (Javier Ramírez)&lt;/a&gt;&lt;br/&gt;
Slides: http://www.slideshare.net/supercoco9/rails-is-not-enough-by-javier-ramirez-at-conferencia-rails-2010-in-madrid-spain&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lightning Talks&lt;/strong&gt;
&lt;a href="http://www.slideshare.net/alberto.perdomo/boost-your-productivity-productivity-tips-for-rails-developers-lightning-talk-conferencia-rails-2010"&gt;Productivity Tips for Rails Developers (Alberto Perdomo)&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://globalplaza.org/spaces/conferencia-rails/attachments/830.all"&gt;Social Stream (Antonio Tapiador)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workshops&lt;/strong&gt;
&lt;a href="http://conferenciarails.org/2010/talks/compass_and_the_960_framework.html"&gt;Compass and the 960 Framework (Juanjo Andrés Prado)&lt;/a&gt;
https://github.com/aentos/workshop_compass&lt;/p&gt;

&lt;p&gt;&lt;a href="http://conferenciarails.org/2010/talks/a_process_automation_workshop.html"&gt;Process Automation (Jorge Dias)&lt;/a&gt;
http://mrdias.com/2010/11/04/conferencia-rails-workshop.html&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://rejectconf.jottit.com/"&gt;RejectConf&lt;/a&gt;&lt;/strong&gt;&lt;br/&gt;
&lt;a href="http://www.slideshare.net/sergio.gil/the-total-ide"&gt;http://www.slideshare.net/sergio.gil/the-total-ide&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://www.slideshare.net/linkingpaths/you-dont-get-8000-customers-without-working-like-a-mule"&gt;http://www.slideshare.net/linkingpaths/you-dont-get-8000-customers-without-working-like-a-mule&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://prezi.com/srl5u25videa/conversaciones-entre-platon-aristoteles-y-amigos-sobre-software/"&gt;http://prezi.com/srl5u25videa/conversaciones-entre-platon-aristoteles-y-amigos-sobre-software/&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/V1fvWtmPGhQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2010/11/14/conferencia-rails-2010/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Migración de ficheros de FileColumn a Paperclip]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/QR-eQ8QI7EU/" />
    <updated>2010-10-30T10:49:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2010/10/30/migracion-de-ficheros-de-filecolumn-paperclip</id>
    <content type="html">&lt;p&gt;Dejo aquí una chuletilla para migrar los attachments de FileColumn a Paperclip que tenía por ahí guardada desde hace meses.&lt;/p&gt;

&lt;p&gt;En este caso lo hice en la migración pero se puede hacer en una tarea rake, o directamente desde la consola. Una vez que tienes los campos necesarios para Paperclip, y los datos del attachment definidos en el modelo, puedes hacer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Modelo.all.each do |f| 
  f.fichero = File.open("#{RAILS_ROOT}/public/modelo/fichero/#{f.id}/#{f.fichero_viejo}",'rb')
  f.save
end 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se puede mejorar mucho, pero como era sólo una vez esto me sirvió, lo dejo aquí por si a alguien más le sirve como punto de partida.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class FdsAPaperclip ActiveRecord::Migration                                                                                                                
  def self.up
    rename_column :fds, :fichero, :fichero_viejo
    add_column :fds, :fichero_file_name, :string
    add_column :fds, :fichero_content_type, :string
    add_column :fds, :fichero_file_size,    :integer
    add_column :fds, :fichero_updated_at,   :datetime

    Fds.all.each do |f| 
      f.fichero = File.open("#{RAILS_ROOT}/public/fds/fichero/#{f.id}/#{f.fichero_viejo}",'rb')
      f.save
    end 

  end 

  def self.down
    rename_column :fds, :fichero_viejo, :fichero
    remove_column :fds, :fichero, :fichero_file_name
    remove_column :fds, :fichero_content_type
    remove_column :fds, :fichero_file_size
    remove_column :fds, :fichero_updated_at
  end 
end
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/QR-eQ8QI7EU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2010/10/30/migracion-de-ficheros-de-filecolumn-paperclip/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Borrar sesiones viejas en Rails 2.3 con ActiveRecordStore]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/vpKs5u951uQ/" />
    <updated>2009-06-24T16:59:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2009/06/24/borrar-sesiones-viejas-en-rails</id>
    <content type="html">&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/vpKs5u951uQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2009/06/24/borrar-sesiones-viejas-en-rails/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Instalación de Feedzirra en Ubuntu 8.04]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/8Fj1kGH6iEc/" />
    <updated>2009-05-15T23:14:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2009/05/15/instalacion-de-feedzirra-en-ubuntu</id>
    <content type="html">&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/8Fj1kGH6iEc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2009/05/15/instalacion-de-feedzirra-en-ubuntu/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Instalación de Rails y Passenger en Ubuntu 8.04 (Hardy)]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/xZ0VTp6-8jE/" />
    <updated>2009-03-11T11:37:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2009/03/11/instalacion-de-rails-y-passenger-en-ubuntu-8-04</id>
    <content type="html">&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/xZ0VTp6-8jE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2009/03/11/instalacion-de-rails-y-passenger-en-ubuntu-8-04/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Euruko 2009 en Barcelona, 9-10 de mayo]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/_7e263XrzRM/" />
    <updated>2008-12-10T19:15:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/12/10/euruko-2009-barcelona-9-10-mayo</id>
    <content type="html">&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/_7e263XrzRM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/12/10/euruko-2009-barcelona-9-10-mayo/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Actualizar RubyGems a la versión 1.3.1]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/cdbPXXlok_g/" />
    <updated>2008-12-02T13:50:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/12/02/actualizar-rubygems-a-la-version</id>
    <content type="html">&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 --system 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ves un &amp;#8220;Nothing to update&amp;#8221;, 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/cdbPXXlok_g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/12/02/actualizar-rubygems-a-la-version/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Cierre del plazo de inscripción para la Conferencia Rails 2008]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/Iqi-v964YZA/" />
    <updated>2008-10-30T14:54:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/10/30/cierre-del-plazo-de-inscripcion-conferenciarails2008</id>
    <content type="html">&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/Iqi-v964YZA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/10/30/cierre-del-plazo-de-inscripcion-conferenciarails2008/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Migrar los repositorios svn a otro servidor]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/O8r4t41BBPU/" />
    <updated>2008-08-12T18:16:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/08/12/migrar-los-repositorios-svn</id>
    <content type="html">&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 &amp;#8216;dump&amp;#8217; 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 --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/O8r4t41BBPU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/08/12/migrar-los-repositorios-svn/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Recuperar contraseñas con restful_authentication]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/M5qS0fJ-mko/" />
    <updated>2008-04-07T22:41:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/04/07/recuperar-contrasenas-con-restful-authentication</id>
    <content type="html">&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;!--more--&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/M5qS0fJ-mko" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/04/07/recuperar-contrasenas-con-restful-authentication/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Autenticación de usuarios con restful_authentication]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/E7FV6tii0kA/" />
    <updated>2008-04-07T19:55:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/04/07/autenticacion-de-usuarios-con-restful-authentication</id>
    <content type="html">&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/E7FV6tii0kA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/04/07/autenticacion-de-usuarios-con-restful-authentication/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Mostrando el contenido del flash en Rails de forma compacta]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/h5abBjl84D8/" />
    <updated>2008-04-07T19:44:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/04/07/mostrando-el-contenido-del-flash</id>
    <content type="html">&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/h5abBjl84D8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/04/07/mostrando-el-contenido-del-flash/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Bogofilter y Evolution en Ubuntu 7.10 ]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/cADq6n5FSwc/" />
    <updated>2008-03-30T10:54:00+02:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/03/30/bogofilter-y-evolution-en-ubuntu</id>
    <content type="html">&lt;p&gt;Ayer, &lt;a href="http://twitter.com/amaiac/statuses/779292755"&gt;entre caja y caja&lt;/a&gt;, estuve actualizando la Ubuntu de mi pc de sobremesa de la 7.04 a la 7.10 y ya con la 7.10 Gutsy Gibbon funcionando me di cuenta que bogofilter, el filtro antispam que tení­a funcionando antes en Evolution no estaba funcionando, ni siquiera actualizaba la bd de aprendizaje.&lt;/p&gt;

&lt;p&gt;Después de googlear un poco y ver este &lt;a href="https://bugs.launchpad.net/ubuntu/+source/evolution/+bug/127530"&gt;bugreport&lt;/a&gt;
me acorde que cuanod lo habí­a instalado en el portátil, que ya tení­a Ubuntu 7.10, además de los pasos normales, habí­a tenido que activar el plugin de antispam en &lt;code&gt;Editar -&amp;gt; Preferencias -&amp;gt; Opciones de Correo -&amp;gt; Spam&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;En la versión anterior sólo habí­a que instalar el paquete bogofilter (&lt;code&gt;sudo apt-get install bogofilter&lt;/code&gt;), activar el plugin de bogofilter en Evolution y desactivar el de spamassasin para que no generara conflictos ( en &lt;code&gt;Editar -&amp;gt; Complementos&lt;/code&gt;), reiniciar Evolution y emnpezar a enseñarle qué mensajes son &lt;code&gt;spam&lt;/code&gt; marcándolos como tal. También hace falta marcar alguno como &lt;code&gt;no spam&lt;/code&gt; para que empiece a aprender, yo para esto marqué algunos mensajes que no eran spam como spam y luego desde la carpeta de spam los volví­ a marcar como no spam. Además al principio (unos dí­as) hay que revisar la carpeta de spam para localizar falsos positivos y marcarlos como no spam para que aprenda. Bogofilter aprende rápidoy después de unos dí­as ya no suele falsos positivos.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/cADq6n5FSwc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/03/30/bogofilter-y-evolution-en-ubuntu/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Cambiar el tamaño por defecto de los text_field y text_area]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/BniizhPTZyM/" />
    <updated>2008-03-12T15:41:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/03/12/cambiar-el-tamano-por-defecto</id>
    <content type="html">&lt;p&gt;Por fin he descubierto cómo se cambia el tamaño por defecto de los &lt;code&gt;text_field&lt;/code&gt; y los &lt;code&gt;text_area&lt;/code&gt; en Rails:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ActionView::Helpers::InstanceTag::DEFAULT_FIELD_OPTIONS = { "size" =&amp;gt; 80 }
ActionView::Helpers::InstanceTag::DEFAULT_TEXT_AREA_OPTIONS = { "cols" =&amp;gt; 80, "rows" =&amp;gt; 10 }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Así­ en vez de modificar los tamaños de los campos uno a uno en los formularios puedo poner por defecto en el environment el valor que más uso y sólo especificarlo en las excepciones.&lt;/p&gt;

&lt;p&gt;Llevaba tiempo buscándolo :)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/BniizhPTZyM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/03/12/cambiar-el-tamano-por-defecto/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Programación ágil con Ruby on Rails]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/N7M8WRJKE4g/" />
    <updated>2008-01-28T22:13:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/01/28/programacion-agil-con-ruby-on</id>
    <content type="html">&lt;p&gt;Se nos habí­a pasado, poner por aquí­, el último artí­culo que publicamos hace unas semanas en la revista de Sólo Programadores sobre Ruby on Rails donde explicamos como hacer una sencilla aplicación de encuentros digitales.&lt;/p&gt;

&lt;p&gt;&amp;#8220;La aplicación que vamos a desarrollar a lo largo del artí­culo sirve para gestionar encuentros digitales. Como es sabido, los encuentros digitales se organizan en sitios web, y permiten a los visitantes formular preguntas que, en un dí­a y hora señalados, serán respondidas por un única persona, habitualmente famosa. Finalizado el encuentro, la lista de preguntas y respuestas queda disponible para su posterior lectura. Por regla general las preguntas son filtradas o moderadas, según su pertinencia, y solo pueden ser respondidas por el famoso/a en cuestión.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Se puede &lt;a href="http://dabne.net/article130.html"&gt;descargar el pdf&lt;/a&gt; de la web de Dabne.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/N7M8WRJKE4g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/01/28/programacion-agil-con-ruby-on/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Orden por defecto de los elementos de una asociación]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/KYgjdaut76Q/" />
    <updated>2008-01-17T20:41:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2008/01/17/orden-por-defecto-de-los</id>
    <content type="html">&lt;p&gt;Un ejemplo:&lt;/p&gt;

&lt;p&gt;Tenemos talleres de formación y para cada taller puede haber varias sesiones en diferentes fechas.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
class Sesion &lt; ActiveRecord::Base
   belongs_to :taller
end
&lt;/pre&gt;


&lt;p&gt;&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
class Taller &lt; ActiveRecord::Base
   has_many :sesiones, :order =&gt; 'fecha'   
end
&lt;/pre&gt;


&lt;p&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Así­ cuando hagas &lt;code&gt;@taller.sesiones&lt;/code&gt;, por defecto estarán ordenadas por fecha.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/KYgjdaut76Q" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2008/01/17/orden-por-defecto-de-los/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Rake task para generar diagramas con RailRoad]]></title>
    <link href="http://feedproxy.google.com/~r/ApuntesDeRails/~3/4mN9a1yGhfs/" />
    <updated>2007-12-28T17:55:00+01:00</updated>
    <id>http://apuntesderails.amaiac.net/2007/12/28/rake-task-para-generar-diagramas-con-railroad</id>
    <content type="html">&lt;p&gt;Hoy estaba usando &lt;a href="http://railroad.rubyforge.org/index.es.html"&gt;RailRoad&lt;/a&gt; para generar los diagramas de modelos y de controladores de un proyecto Rails en el que estoy trabajando y he visto que en la página de &lt;a href="http://railroad.rubyforge.org/index.es.html"&gt;RailRoad&lt;/a&gt; vení­a el código (gracias a &lt;a href="http://www.galaxy-ritz.de/"&gt;Thomas Ritz&lt;/a&gt;) de una tarea rake que genera los diagramas en svg y los deja en el directorio doc de la aplicación.&lt;/p&gt;

&lt;p&gt;Como también querí­a que generase los diagramas en png la he modificado para que los incluya. Queda así­ (&lt;code&gt;lib/tasks/diagrams.rake&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;/code&gt;
# Rake task tomada de la página de Railroad (http://railroad.rubyforge.org/)
# Gracias a Thomas Ritz por el código (http://www.galaxy-ritz.de/)
# Modificada por Amaia Castro (amaia@dabne.net) para incluir la generación de 
# diagramas en png.

namespace :doc do
  namespace :diagram do
    task :models do
      sh &amp;#8220;railroad -i -l -a -m -M | dot -Tsvg | sed &amp;#8216;s/font-size:14.00/font-size:11.00/g&amp;#8217; &gt; doc/models.svg&amp;#8221;
    end
    task :models_png do
      sh &amp;#8220;railroad -i -l -a -m -M | dot -Tpng | sed &amp;#8216;s/font-size:14.00/font-size:11.00/g&amp;#8217; &gt; doc/models.png&amp;#8221;
    end

    task :controllers do
      sh &amp;#8220;railroad -i -l -C | neato -Tsvg | sed &amp;#8216;s/font-size:14.00/font-size:11.00/g&amp;#8217; &gt; doc/controllers.svg&amp;#8221;
    end
    task :controllers_png do
      sh &amp;#8220;railroad -i -l -C | neato -Tpng | sed &amp;#8216;s/font-size:14.00/font-size:11.00/g&amp;#8217; &gt; doc/controllers.png&amp;#8221;
    end
  end

  task :diagrams_svg =&gt; %w(diagram:models diagram:controllers)
  task :diagrams_png =&gt; %w(diagram:models_png diagram:controllers_png)
  task :diagrams =&gt; %w(diagram:models diagram:models_png diagram:controllers diagram:controllers_png)
end
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Para que funcione hay que tener instalada la gem &lt;code&gt;railroad&lt;/code&gt; y, en Ubuntu (y otros linux supongo), el paquete &lt;code&gt;graphviz&lt;/code&gt;, que es el que contiene &lt;code&gt;dot&lt;/code&gt; y &lt;code&gt;neato&lt;/code&gt;, para hacer la conversion de DOT a svg o png.&lt;/p&gt;

&lt;p&gt;Luego en nuestra aplicación rails ejecutar &lt;code&gt;rake doc:diagrams&lt;/code&gt; para generar todos los diagramas o &lt;code&gt;rake doc:diagram:models&lt;/code&gt; para generar el de modelos en svg, por ejemplo.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ApuntesDeRails/~4/4mN9a1yGhfs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://apuntesderails.amaiac.net/2007/12/28/rake-task-para-generar-diagramas-con-railroad/</feedburner:origLink></entry>
  
</feed>

