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 :)