Apuntes de Rails

y de otras cosas

Conferencia Rails 2010

La semana pasada tuvo lugar la 5ª Conferencia Rails, la 4º a la que asisto.

Este año ha habido un sólo track 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).

Pronto estarán disponibles los vídeos pero mientras hago aquí una lista de las slides publicadas hasta ahora para encontrarlas más fácilmente.

[ACTUALIZACIÓN] Videos publicados en http://globalplaza.org/spaces/conferencia-rails/events/conferencia-rails-2010

Migración de ficheros de FileColumn a Paperclip

Dejo aquí una chuletilla para migrar los attachments de FileColumn a Paperclip que tenía por ahí guardada desde hace meses.

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:

Modelo.all.each do |f| 
  f.fichero = File.open("#{RAILS_ROOT}/public/modelo/fichero/#{f.id}/#{f.fichero_viejo}",'rb')
  f.save
end 

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.

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

Borrar sesiones viejas en Rails 2.3 con ActiveRecordStore

Tarea rake para borrar las sesiones que no se han utilizado en las ultimas 3 horas.

desc "Borrar de la base de datos la sesiones que han expirado ."
task :delete_old_sessions => :environment do
 sesiones = ActiveRecord::SessionStore::Session.find(:all, :conditions => ['updated_at < ?', 3.hours.ago])
 sesiones.each {|s| s.delete}
end

Instalción de Rails y Passenger en Ubuntu 8.04 (Hardy)

Instalación de ruby:

sudo apt-get install build-essential 
sudo apt-get install ruby rdoc ri irb libopenssl-ruby1.8 ruby1.8-dev

Instalación de rubygems desde las fuentes, porque los paquetes para Ubuntu no están disponibles para la última versión:

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

Ahora puedes borrar los ficheros que has descargado en/usr/local/src/ si quieres.

Instalación de sqlite3 (opción por defecto a partir de rails 2 para la base de datos):

sudo apt-get install sqlite3 libsqlite3-dev
sudo gem install sqlite3-ruby

Instalación de Rails:

sudo gem install rails

Instalación de apache y mysql:

sudo apt-get install apache2 
sudo apt-get install mysql-server mysql-client libmysqlclient15-dev

sudo gem install mysql

Para usar virtual hosts en apache quitar la linea

NameVirtualHost * 

de /etc/apache2/sites-available/default

Cambiar la primera linea por <VirtualHost *:80>

En /etc/apache2/apache2.conf poner

NameVirtualHost *:80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
</IfModule>

antes de

# 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/

Crear /var/www/default y mover ahí­ el index.html que hay en /var/www

Cambiar el DocumentRoot de /etc/apache2/sites-available/default al nuevo directorio.

Instalación de Passenger (a.k.a mod_rails):

sudo gem install passenger
sudo passenger-install-apache2-module

Y seguir las instrucciones. No te olvides de poner las tres lí­neas que te dice Passenger en el fichero de configuración de apache /etc/apache2/apache2.conf (yo lo pongo antes de lo del VirtualHost del párrafo anterior).

Otra opción de instalación para Ubuntu Hardy 8.04 es el paquete que ha hecho BrightBox.

Luego en el virtual host para la aplicación Rails pones como DocumentRoot la ruta al directorio public de la aplicación y ya está. Si quieres afinar más la configuración mí­rate la guí­a de usuario de Passenger.

Actualizar RubyGems a la versión 1.3.1

La versión 1.1 y la 1.2 de RubyGems tienen problemas para actualizarse, si después de ejecutar

$ sudo gem update --system 

ves un “Nothing to update”, prueba a instalar y ejecutar la gema rubygems-update:

$ sudo gem install rubygems-update
$ sudo update_rubygems

Y a correr :)

Cierre del plazo de inscripción para la Conferencia Rails 2008

Como la mayorí­a ya sabréis, la Conferencia Rails 2008 será los próximos dí­as 13 y 14 de noviembre en Madrid, en la Escuela de Teleco.

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 dí­a 5 tendrí­a que estar ya el pago en nuestra cuenta), para que de tiempo a organizarlo todo.

Así­ que si vas a venir y todaví­a no te has apuntado, ¿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.

Si lo que pasa es que no lo tienes claro puedes mirar el calendario de charlas y terminar de convencerte de que no te lo puedes perder ;)

Migrar los repositorios svn a otro servidor

Ya sé que lo que más mola ahora es Git, pero de momento en Dabne 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.

El caso es que esta semana he tenido que mover los repos a un nuevo servidor y así­ es cómo lo he hecho.

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.

Serí­a así­:

serv1$ svnadmin dump nombre_repo > nombre_repo.dump

Se copian los ficheros .dump al servidor 2 y se hace:

serv2$ svnadmin create nombre_repo
serv2$ svnadmin load nombre_repo < nombre_repo.dump

Como tení­a varios he probado a hacerlo con un scriptcillo en ruby directamente desde la lí­nea de comandos:

serv1$ ruby -e "Dir.foreach('.'){|x| system \"svnadmin dump #{x} > #{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]} < #{x} \"}"

Si la url del repositorio cambia luego en cada copia de trabajo hay que ejecutar:

$ svn switch --relocate url_antigua url_nueva

Cuidado con lo que va delante de relocate que son dos -, no uno de esos largos.

Esta vez he configurado el acceso a los repositorios con apache2 por https, pero eso queda para otro post.