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

Instalación de Feedzirra en Ubuntu 8.04

Feedzirra en un parser de feeds muy rápido, basado en nokogiri y libxml.

Primero hay que instalar nokogiri:

sudo aptitude install libxslt-dev libxml2 libxml2-dev
sudo gem install nokogiri

y luego feedzirra:

sudo apt-get install libcurl4-openssl-dev
sudo gem install pauldix-feedzirra -s http://gems.github.com

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.


Euruko 2009 en Barcelona, 9-10 de mayo

Pues sí, ya tenemos fechas oficiales para la próxima Euruko (European Ruby Conference), será el fin de semana del 9-10 de Mayo de 2009 en Barcelona, en el Citilab.

Nos vemos por allí.


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.


Recuperar contraseñas con restful_authentication

Continuación del post anterior para recuperar las contraseñas olvidadas.

+ leer más


Autenticación de usuarios con restful_authentication

Pasos para crear una aplicación rails con autenticación de usuarios.

Crear la aplicación rails:

$ rails myapp
$ cd myapp

Instalar el plugin restful_authentication:

$  script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/

Generar el sistema de autenticación:

$ script/generate authenticated user session
$ rake db:migrate

En config/routes.rb añadir lo siguiente antes de las rutas por defecto (las dos últimas)

map.resources :users
map.resource  :session, :controller => 'session'

map.signup '/signup', :controller => 'users', :action => 'new'
map.login  '/login', :controller => 'session', :action => 'new'
map.logout '/logout', :controller => 'session', :action => 'destroy'

En app/controllers/application_controller.rb poner la línea siguiente, que viene en los controladores user_controller.rb y session_controller.rb que ha creado el plugin.

include AuthenticatedSystem

Poniendolo en application_controller.rb hacemos que la autenticación esté disponible para todos los controladores.

Ahora en los controladores para los que queramos restringir el acceso a usuarios autenticados tendremos que poner un filtro:

before_filter :login_required

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:

before_filter :login_required, :only => [:create, :destroy]
before_filter :login_required, :except => [:index, :show]

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 before_filter en application_controller.rb y luego pongo un skip_before_filter donde sea necesario, que en este caso es en users_controller.rb y session_controller.rb para permitir crear nuevos usuarios y hacer login, que en realidad es crear una nueva session. Por tanto en estos dos controladores pongo:

skip_before_filter :login_required, :only => [:new, :create]

Si además hay una portada de la aplicación pública también habrá que aplicarle esto.

Para hacer que el registro sea con activación de usuarios por email, ver este otro post.


Mostrando el contenido del flash en Rails de forma compacta

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.

En app/views/layouts/application.html.erb:

<% flash.each do |key, msg| -%>
  <%= content_tag :div, msg, :class => key, :id => 'flash' %>
<% end -%>

Esto crea un div con id flash y class la clave del hash, que normalmente será error o notice.

Luego en la css pones los estilos correspondientes y ya queda mucho mejor.


   #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; 
   }


Bogofilter y Evolution en Ubuntu 7.10

Ayer, entre caja y caja, 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.

Después de googlear un poco y ver este bugreport 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 Editar -> Preferencias -> Opciones de Correo -> Spam.

En la versión anterior sólo había que instalar el paquete bogofilter (sudo apt-get install bogofilter), activar el plugin de bogofilter en Evolution y desactivar el de spamassasin para que no generara conflictos ( en Editar -> Complementos), reiniciar Evolution y emnpezar a enseñarle qué mensajes son spam marcándolos como tal. También hace falta marcar alguno como no spam 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.


Cambiar el tamaño por defecto de los text_field y text_area

Por fin he descubierto cómo se cambia el tamaño por defecto de los text_field y los text_area en Rails:

ActionView::Helpers::InstanceTag::DEFAULT_FIELD_OPTIONS = { "size" => 80 }
ActionView::Helpers::InstanceTag::DEFAULT_TEXT_AREA_OPTIONS = { "cols" => 80, "rows" => 10 }

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.

Llevaba tiempo buscándolo :)


Orden por defecto de los elementos de una asociación

Un ejemplo:

Tenemos talleres de formación y para cada taller puede haber varias sesiones en diferentes fechas.


class Sesion < ActiveRecord::Base
   belongs_to :taller
end


class Taller < ActiveRecord::Base
   has_many :sesiones, :order => 'fecha'
end

Así cuando hagas @taller.sesiones, por defecto estarán ordenadas por fecha.


Rake task para generar diagramas con RailRoad

Hoy estaba usando RailRoad 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 RailRoad venía el código (gracias a Thomas Ritz) de una tarea rake que genera los diagramas en svg y los deja en el directorio doc de la aplicación.

Como también quería que generase los diagramas en png la he modificado para que los incluya. Queda así (lib/tasks/diagrams.rake):


# 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 "railroad -i -l -a -m -M | dot -Tsvg | sed 's/font-size:14.00/font-size:11.00/g' > doc/models.svg"
    end
    task :models_png do
      sh "railroad -i -l -a -m -M | dot -Tpng | sed 's/font-size:14.00/font-size:11.00/g' > doc/models.png"
    end

    task :controllers do
      sh "railroad -i -l -C | neato -Tsvg | sed 's/font-size:14.00/font-size:11.00/g' > doc/controllers.svg"
    end
    task :controllers_png do
      sh "railroad -i -l -C | neato -Tpng | sed 's/font-size:14.00/font-size:11.00/g' > doc/controllers.png"
    end
  end

  task :diagrams_svg => %w(diagram:models diagram:controllers)
  task :diagrams_png => %w(diagram:models_png diagram:controllers_png)
  task :diagrams => %w(diagram:models diagram:models_png diagram:controllers diagram:controllers_png)
end

Para que funcione hay que tener instalada la gem railroad y, en Ubuntu (y otros linux supongo), el paquete graphviz, que es el que contiene dot y neato, para hacer la conversion de DOT a svg o png.

Luego en nuestra aplicación rails ejecutar rake doc:diagrams para generar todos los diagramas o rake doc:diagram:models para generar el de modelos en svg, por ejemplo.


Error de SSL al instalar Rails

Si al intentar instalar Rails en Ubuntu da un error como

$ sudo gem install rails
ERROR:  While executing gem ... (Gem::Exception)
    SSL is not installed on this system

es que hay que instalar libopenssl-ruby

$ sudo apt-get install libopenssl-ruby

Al menos así es como ha funcionado en mi viejo pc, al que le he regalado una instalación nuevecita de Rails por Navidad ;)


RESTful authentication con activación de usuarios

Esta mañana he estado pegándome con el plugin restful_authentication para que activase correctamente los usuarios. Por "suerte" Jaime estaba en las mismas y después de hablar un ratillo por jabber hemos conseguido que funcionase correctamente. Había que hacer un par de cosas que no están bien explicadas en la documentación del plugin y que hemos encontrado en los comentarios de la página del plugin en el directorio de plugins de agilewebdevelopment.com.

Dejo aquí apuntados los pasos para futura referencia.

Primero instalar el plugin:

$ script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/

Crear los usuarios y las sesiones con activación de usuarios con el generador que trae el plugin:

$ script/generate authenticated user session —include-activation
$ rake db:migrate

Añadir las rutas necesarias en config/routes.rb, según el README del plugin:

map.resources :users
map.resource  :session, :controller => 'session'

map.signup '/signup', :controller => 'users', :action => 'new'
map.login  '/login', :controller => 'session', :action => 'new'
map.logout '/logout', :controller => 'session', :action => 'destroy'

Y una que no viene en la doc pero que es necesaria para que funcionen los links de activación enviados por email.

map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate'

Configurar ActionMailer para que envíe correo. Poner las urls correctas para nuestra aplicación en app/models/user_mailer.rb. En lugar de ponerlas a pelo, se puede definir HOST en environment.rb con:

HOST = "localhost:3000"

y luego en app/models/user_mailer.rb poner:

@body[:url]  = "#{$HOST}/activate/#{user.activation_code}"

Por último, no queremos que el usuario quede logueado al registrarse, si no ¿qué sentido tiene la activación? Para esto hay que comentar la línea que dice self.current_user = @user después de @user.save! en el método create de users_controller.rb:


  def create
    cookies.delete :auth_token
    @user = User.new(params[:user])

    @user.save!
    # ** No logueamos al usuario hasta que se haya validado **
    # self.current_user = @user 
    redirect_back_or_default('/')
    flash[:notice] = "Thanks for signing up! Follow the instructions mailed to you to activate your account."
  rescue ActiveRecord::RecordInvalid
    render :action => 'new'
  end

Una vez hecho todo esto no olvidar reiniciar mongrel y poner en controllers/application.rb

include AuthenticatedSystem

y en los controladores a los que se quiera restringir el acceso

before_filter :login_required

En Railscasts hay un episodio muy chulo sobre este plugin, y aunque no cubre la parte de activación de usuarios, está bien para ver como va la cosa.


Rails 2.0 ya está aquí

Ya se ha comentado hoy que Rails 2.0 estaba a punto, que ya había tag 200 y el milestone 2.0 ya se había completado.

Pues bien, hace un rato, David lo ha publicado en Riding Rails, el blog de Ruby on Rails. Corre a leerlo si quieres enterarte de todas las mejoras que tiene.

Y yo me acabo de bajar el pdf de Rails 2.0 de Peepcode gratis gracias a supercoco :)


Más Hpricot para el Buscaboe

Hoy me ha extrañado que el BuscaBoe, nuestro buscador de subvenciones, llevase varios días que no encontraba nada. Ya me pareció raro cuando lo ví el sábado, pero pensé que igual era por el fin de semana, que no habían publicado nada relativo a ayudas o subvenciones, y como todavía andaba con la resaca post-conferencia, pues no le dí mucha imprtancia.

Hoy he mirado la página del BOE para comprobarlo y resulta que han cambiado la estructura del html de la página del sumario, que es la que usa el BuscaBoe para buscar. La verdad es que ahora está mejor estructurada que antes, aunque todavía no acabe de estar bien.

Aprovechando que tenía que cambiar el patrón de búsqueda he decidido hacerlo con hpricot, que viene al pelo para estas cosas (antes usaba una expresión regular).

El meollo de la cuestión queda así con la nueva estructura:

+ leer más


Presentaciones online de la Conferencia Rails 2007

Acabo de publicar en el blog de la empresa la presentación que hizo Carolina para nuestra ponencia en la Conferencia Rails 2007.

También dejo por aquí una recopilación de las demás presentaciones que he encontrado publicadas, iré actualizandola cuando encuentre más.


Fin de la Conferencia Rails 2007

Ayer por la tarde, a eso de las 9, nos fuimos los últimos. Han sido sido unos días intensos y he acabado hecha polvo pero he disfrutado mucho, ha sido una conferencia genial.

Empezamos el miércoles por la tarde con la última reunión de organización, luego nos fuimos parte del equipo de organización a cenar con Obie y Desi y nos lo pasamos tan bien que llegué a casa a las 3. Añade a eso dos días enteros de charlas y gente interesante y otra cena y ayer me tuve que ir a dormir a las 11. Para no perder ritmo, aunque hoy me he levamtado tarde, me he pasado el resto del día en BioCultura, para que luego digan que no aguanto ná ;)

De las charlas a las que asistí, las que más me han gustado han sido RoR también puede hablar: Interface de voz con Rails y Programa en Rails como si jugases con Lego, de la que Javier ya ha colgado el pdf.

Me perdí la de Marze para ver la de Joaquín y creo que tenía que haber hecho al revés, después de ver el resumen que ha publicado Marze, que por cierto es quien ha hecho todo el diseño de la web de la conferencia. También me perdí la de Inteligencia artificial porque coincidía con la mía

Menos mal que las podré ver en video :)

La que no sé si podré ver en vídeo es la de Jaime, sobre su araña Boris. Fui a la de Internacionalización en su lugar.

Jan hizo una presentación improvisada del proyecto FIT (Found in Translation), en el que Carolina y yo hemos empezado a trabajar hace un par de semanas.

Me gustó mucho la keynote de Obie sobre Rails 2.0, aunque me perdí el principio porque estábamos organizando lo de los premios de los concursos. La de empresas estuvo más floja por la propaganda de microsoft y la de sun, aunque las intervenciones de Alberto y Jaime estuvieron mejor. También nos reímos mucho en la mesa redonda de frameworks (gracias Marcos ;)

Aunque el viernes por la tarde ya no podía con mi alma, me he quedado con ganas de más, pero me temo que habrá que esperar hasta el año que viene.


Gedit y Rails

Hace un tiempo usaba RadRails como entorno de desarrollo Rails, y la verdad es que me resultaba muy cómodo, por tenerlo todo junto y por su integración con subversion. Pero un día empezó a darme problemas y quedarse colgado sin razón aparente, a no reconocer los repositorios svn y algunas otras incomodidades.

Probé a desinstalarlo y volverlo a instalar varias veces, pero nada, después de un tiempo volvía a hacer de las suyas. La verdad es que no sé por qué fue, porque durante unos meses me fue de perlas, pero el caso es que empezó a no ser viable trabajar con él.

Así que busqué una alternativa y me encontré con que Gedit, el editor por defecto de Gnome, se puede parecer mucho a TextMate, o eso dicen, yo nunca he usado textmate.

Ya le había cogido el gustillo a Gedit, desde que averigué que podía editar directamente los ficheros en el servidor mediante ssh. Para editar plantillas como la de este blog u otros de wordpress, o sitios spip es muy útil.

Así que me puse manos a la obra para convertir Gedit en mi entorno de desarrollo Rails habitual. La útima versión de las instrucciones que encontré está en http://blog.nationcode.com/2007/5/30/emular-textmate-en-linux

Es verdad que Gedit no tiene integración con Subversion, pero como se puede abrir un terminal en la parte de abajo de la ventana, pues tampoco es mucho problema.

Otra opción es instalar los scripts de svn para Nautilus:

sudo apt-get install nautilus-script-collection-svn

Para activar los scripts hay que hacer:

nautilus-script-manager enable Subversion

y con el botón derecho tienes acceso a las operaciones de subversion directamente desde el explorador de ficheros.


Obie Fernández en la Conferencia Rails 2007

Ya quedan menos de dos semanas para la Conferencia Rails y estamos a tope ultimando los detalles. Puedes seguirnos en twitter.

Habrá un concurso de screencasts y otro de desarrollo rápido, se grabarán todas las charlas en vídeo y probablemente se emita por streaming la sala principal.

Y además Obie Fernández vendrá a hablarnos de Rails 2.0. Todo un lujo.


¿Contraseñas en los logs?

Si no quieres que las contraseñas de tus usuarios aparezcan en tus logs en claro puedes añadir lo siguiente en applicattion_controller.rb:

filter_parameter_logging "password"

Esto hace que los campos del formulario que contengan "password" en el nombre no se escriban en el log. Se filtrarían tanto el campo "password" como "password_conformation", por ejemplo.


Ponencia en la Conferencia Rails 2007

Carolina y yo presentaremos nuestro caso de estudio Rails en una microempresa en la Conferencia Rails de este año.

Hablaremos de cómo hemos usado Rails en nuestra microempresa, por qué nos hemos decidido a usarlo y cómo lo compaginamos con otros sistemas que usamos para el desarrollo web.

Explicaremos varios de los proyectos (pequeños comparados con otros que se presentan en la conferencia) que hemos hecho en Rails y porqué Rails los ha hecho posibles en una microempresa sin capital inicial y con los recursos muy justos.

Algunos ejemplos:

  • Gestores de contenidos simples pero específicos, en los que adaptar un programa libre ya existente sería más trabajo que hacerlo desde cero en Rails.
  • Aplicaciones de gestión interna
  • Proyectos propios sin cliente, es decir sin dinero a corto plazo.

Descubriendo las rake tasks

Hasta hace poco sólo había usado rake para cosas típicas como

rake db:migrate
rake annotate_models

y otras de las que ya vienen definidas el Rails o en los plugins que instalo.

Pero para aprender a integrar los mapas de Google en el Directorio de Economía Social me hice con el libro "Beginning Google Maps Applications with Rails and Ajax" y ahí los ejemplos de geocodificación son con tareas rake, con lo que empecé a verles el enorme potencial que tienen. En la web de Railscasts hay un screencast bastante interesante sobre esto: Custom Rake Tasks.

Un ejemplo de geocodificacion de direcciones de empresas en el Directorio (fichero lib/tasks/geocode_empresas.rake):


task :geocode_empresas => :environment do
  api_key=GOOGLE_MAPS_API_KEY

  Empresa.find(:all).each do |empresa|
   begin    
    if empresa.geocode_status == nil
      empresa.geocode
      puts "Empresa: #{empresa.nombre}"
      puts "Dirección: #{empresa.direccion_completa}"
      puts "geocode_status: #{empresa.geocode_status}"
      puts "—"
    end
   rescue Exception => e
     puts "Empresa: #{empresa.nombre}"
     puts "Dirección: #{empresa.direccion_completa}"
     puts "—Excepción—"
     puts e
   end
  end # end each store
end # end rake task

Como es algo que puede tardar y no quería dejar al usuario esperando a que geocodificase su dirección al guardar la ficha de empresa, es algo que se hace desde la tarea rake, ya sea desde cron o línea de comnados en cualquier momento con:

rake geocode_empresas

+ leer más


Carolina también (se une al blog)

Ya somos tres :)

Esto se va a llenar de aventuras raileras de un momento a otro ;)


Manu se une al blog

A partir de hoy comparto blog con Manu, que escribirá también por aquí sus aventuras raileras.

Sólo nos falta liar a Carolina para que escriba algo también, a ver si se anima ;)


Buscador de subvenciones en Rails

El buscador de subvenciones que comentaba en el post anterior ya está funcionando :)

BuscaBoe es un robot web desarrollado con Ruby on Rails que se lee el sumario del BOE todas las mañanas y recoge las entradas que contienen “ayuda” o “subvención”. También ofrece la posiblidad de buscar entre las entradas recogidas.

El otro día estuve con Carolina, añadiendole un buscador, para poder buscar dentro de las entradas recogidas por el robot.

Ahora le falta un poco de rodaje e ir corrigiendo los fallos que puedan surgir, bueno, y puede que algún cambio de diseño.

Como la cosa emprezó con un script ruby solitario que se ejecutaba con cron todas las mañanas, y todavía no había conseguido que me funcionasen ni Hpricot ni scRUBYt, para leer la pagina del sumario del BOE usa open-uri, y con una expresión regular que saqué a base de prueba y error, busca todas las entradas (h3 en el html) que contienen "ayuda" o subvención".

Al convertir el script en aplicación Rails, aproveché para leer el enlace correspondiente con Hpricot y sacar la sección a la que pertenece.


Las fechas y el plugin localization_simplified

En estos días he estado convirtiendo en aplicación rails un pequeño script en ruby que tenía para mirar el boe todas las mañanas y buscar ayudas y subvenciones.

Al hacer la aplicación rails, instalé el plugin l10n_simplified. Como en el plugin se redefinen cosas como los mensajes de error, el formato de las fechas y demás, yo me lancé a ponerlo un poco más a mi gusto y en esas modifiqué el formato de fecha default, para ponerlo en el orden habitual por estos lares, que es dia-mes-año, sin darme cuenta que con eso la estaba liando.

En la aplicación tengo algo como:

fecha = Date.today
...
# leer la pagina del boe de hoy y buscar las entradas que contengan 'ayuda' o 'subvención'
...
Entrada.create(:fecha => fecha, :numero_boe => numero, :texto => texto, :enlace => enlace, :seccion => seccion, :subseccion => subseccion)

Eso que en princpio tendría que funcionar sin problema, mezclado con mi modificación del l10n_simplified hace un estropicio. Lo malo es que no salta ningún error, simplemente se generan fechas no válidas, del tipo 0000-00-00, con lo que te encuentras con una base de datos llena de datos inválidos.

El problema se debe a que al hacer una asignación de la fecha así, se usa el método to_s del objeto Date y como el plugin lo modifica pues se generan cadenas no válidas. Si se hace la asiganción de las fechas con los datos procedentes de un formulario que rellena el usuario no hay problema.

Después de estar un buen rato googleando y volviendome loca, he desintalado el plugin, porque en realidad no lo estaba usando en esta aplicación, y todo va como la seda, ya no tengo un montón de entradas perdidas en el tiempo :)

Podeis ver el resultado en http://buscaboe.dabne.net.


Error con Hpricot

Hace tiempo que descubrí Hpricot y me pareció una librería muy útil e interesante, pero al intentar probar el ejemplo de la página principal siempre me daba error. Dentro de una aplicación Rails funcionaba, pero si intentaba ejecutar el ejemplo desde la línea de comandos me daba este error:


./hpricot.rb:8: undefined method `Hpricot' for main:Object (NoMethodError)
        from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
        from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
        from hpricot.rb:5

Probé mil y una maneras de poner los requires y nada, pues al final ayer, no se por qué, se me ocurrió ponerlo así:

require 'rubygems'
require 'open-uri'
gem 'hpricot'
require 'hpricot'

y ¡tachán! funcionó.


Libro de Rails gratis

Esta mañana me ha llegado un email de SitePoint anunciando que durante 60 días ofrecen la descarga gratuita de su libro "Build Your Own Ruby on Rails Web Applications" escrito por Patrick Lenz.

Yo ya me he bajado mi copia ¿y tú?


Abierto el registro para la Conferencia Rails 2007

Será el 22 y 23 de noviembre en Madrid, en la Universidad Politécnica, como el año pasado.

Corre a registrarte ya, que sólo son 75€ y las plazas son limitadas.

También hay prevista una cena (no incluida en el precio) para la noche del jueves 22, a la que iremos muchos de los asistentes. El sitio todavía no está decidido.

Puedes ver la lista de ponencias recibidas para hacerte una idea de los temas que se tratarán, aunque todavía no están aceptadas, y estamos a la espera de recibir más (hasta el 7 de octubre), sobre todo de casos de uso de Rails en proyectos reales.

Nos vemos por allí.


Crear una base de datos MySQL en utf-8

Comando para crear una base de datos MySQL en utf-8, para que luego no dé problemas con Rails:

CREATE DATABASE `base_de_datos` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Además en el fichero config/database.yml hay que añadir:

encoding: utf8

scRUBYt en Ubuntu

Estaba intentando probar scRUBYt pero después de instalar todo tal y como dicen en la página de instalación, me seguía saliendo este error

/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load—parse_tree_reloaded (LoadError)
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
    from /usr/lib/ruby/gems/1.8/gems/scrubyt-0.3.0/lib/scrubyt.rb:9
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:32:in `gem_original_require'
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:32:in `require'

Al final de los comentarios de esa página hay uno que dice que hay que instalar parsetreereloaded (sin guiones como pone en otro)

sudo gem install parsetreereloaded

y con eso ya me ha funcionado.

Ahora a probar los ejemplos y a aprender a hacer mis propios scrapers con scRUBYt :)


Instalando Rails en Ubuntu

Hace tiempo que tengo instalado Rails en mi Ubuntu (Feisty Fawn) de sobremesa, pero como no apunté como lo hice cuando lo instalé, pues ahora que lo he ido a instalar en el portátil he tenido que googlear otra vez para acordarme de todos los pasos. Los apunto aquí para futura referencia.

sudo apt-get install ruby ri rdoc mysql-server libmysql-ruby irb

Descargamos la última versión de Rubygems:

tar xzvf rubygems-0.9.4.tgz 
cd rubygems-0.9.4
sudo ruby setup.rb

Ahora instalamos la gem de rails y todas sus dependencias:

sudo gem install rails —include-dependencies

La primera vez que he ejecutado este comando me ha dado un error de que no encontraba la gema de rails, pero haciendo gem update y ejecutándolo otra vez ha ido bien.

Con esto ya tenemos Rails funcionando con MySQL. Esta vez parece que han sido muchas menos cosas que la otra vez.


Exception Notifier Plugin

Este plugin envía notificaciones por correo cada vez que en la aplicación salta una excepción (sólo en producción).

Para instalarlo:

script/plugin install http://dev.rubyonrails.org/svn/rails/plugins/exception_notification/

Luego siguiendo las instrucciones del README en apps/controllers/aaplication.rb hay que incluir:

include ExceptionNotifiable

y en environment.rb hay que poner:

ExceptionNotifier.exception_recipients = %w(email1@dominio.com email2@dominio.com)

# defaults to exception.notifier@default.com
ExceptionNotifier.sender_address = %("Exception Notifier" <notifier@dominio.com>)

# defaults to "[ERROR] "
ExceptionNotifier.email_prefix = "[App Exception] "

Y configurar ActionMailer para que pueda enviar los correos de notificación. Un ejemplo con SMTP con autenticación:

ActionMailer::Base.smtp_settings = {
  :address => 'dominio.com',
  :domain  => 'dominio.com',
  :port     => 25,
  :authentication => :plain,
  :username => 'notifier',
  :password => 'password'
}

Si preferimos usar sendmail habría que poner:

ActionMailer::Base.delivery_method = :sendmail

Más info sobre la configuración de ActionMailer aquí.


Abierto el call for papers para la Conferencia Rails Hispana 2007

Después de varias reuniones del grupo organizador, donde hemos empezado a darle forma a la conferencia de este año ya está abierto el plazo para presentar propuestas de ponencias.

Envía la tuya a ponencias@conferenciarails.org con la propuesta de charla, que debe incluir:

  • Tu nombre
  • Tu e-mail
  • Un extracto del contenido de no mas de 200 palabras.

Más información en la web de la conferencia.


Usar métodos de controladores en las vistas

Se supone que tu aplicación debería estar bien diseñada y no haría falta hacer esto, pero la realidad es que no siempre es así y a veces necesitamos hacerlo, aunque sólo sea hasta que aprendamos otra forma mejor de solucionarlo.

Hoy ha llegado un punto en el que necesitaba la misma función en las vistas y en el controlador (para poner el texto generado en un excel) y buscando por ahí he encontrado esto:

http://www.mslater.com/2007/2/20/using-controller-methods-in-views

Viene a decir que pongas el metodo (o métodos) en cuestión en el controlador y que luego hagas

helper_method :un_metodo, :otro_metodo

y así quedarán también disponibles como helpers en las vistas de ese controlador. Si lo quieres para toda la aplicación pues en el application.rb.


Tutoriales en RailsForum

Un montón de tutoriales útiles:

http://www.railsforum.com/viewforum.php?id=20


Plugins habituales

Annotate Models

http://agilewebdevelopment.com/plugins/annotate_models

$ script/plugin install http://repo.pragprog.com/svn/Public/plugins/annotate_models

Manage Fixtures

http://agilewebdevelopment.com/plugins/manage_fixtures

$ script/plugin install http://svn.toolbocks.com/plugins/manage_fixtures/

Localization Simplified

http://agilewebdevelopment.com/plugins/localization_simplified

$ script/plugin install svn://rubyforge.org/var/svn/l10n-simplified

Acts as Taggable on Steroids

http://agilewebdevelopment.com/plugins/actsas_taggableon_steroids

$ script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids

Gemas en vendor

Para no depender de lo que haya instalado en el hosting, se pueden instalar las gemas necesarias para nuestra aplicación en el directorio vendor.

Ejemplo con la gem spreadsheet-excel:

En el ordenador de desarrollo, donde puedes instalar lo que quieras, instalas la gema con

$ sudo gem install spreadsheet-excel

la "desempaquetas" en vendor con

$ cd vendor 
$ gem unpack spreadsheet-excel

luego añades

config.load_paths += %W( #{RAILS_ROOT}/vendor/spreadsheet-excel-0.3.5.1/lib )

en el environment.rb para que coja el directorio de la gema

y ya está ;)


Cómo paginar, ordenar y hacer búsquedas en una tabla con Ajax y Rails

En español y el original en inglés


Plugin para localización de aplicaciones en Rails

Plugin para localización de aplicaciones en un idioma que no sea inglés. Traduce los mensajes de error, las fechas y algunas cosillas más

http://www.agilewebdevelopment.com/plugins/localization_simplified

Sólo hay que instalarlo y editar el fichero init.rb en vendor/plugins/l10n-simplified, comentar la línea en danés y descomentar la línea de español (a no ser que quieras otro idioma, claro, si te mola el danés lo puedes dejar así)

Para hacer sitios multilingües recomiendan por ahí mirar GLoc o Globalize.


Crear proyectos rails con una version especifica de rails

Lo he leído aquí

hay que poner

$ rails _1.1.6_ miproyectorails

pues eso, para que no se me olvide