Instalar Ruby on Rails en Linux
He aprovechado para hacer un pequeño tutorial sobre el proceso de instalación en Debian (o en cualquier otro Linux), que lo cierto es que es bastante complejo. También incluyo un mini-ejemplo de aplicación web en Ruby on Rails.
Os adelantaré que el proceso de deploy de la aplicación web me ha recordado muchísimo al deploy de servlets en Tomcat, y de hecho, según dicen, Ruby on Rails pretende ser una suerte de PHP pero orientado a objetos, y además, elegante y divertido de programar. En sí, Ruby es el lenguaje de programación, que ya existía previamente, y Rails es un framework para Ruby para desarrollar aplicaciones web.
Instalamos rails y el módulo de ruby para Apache. Debian se encargará de instalarnos el resto de dependencias (que son muchas).
newton:~# apt-get install ruby libapache-mod-ruby
Una vez instalado, procedemos a bajarnos RubyGems (http://rubygems.rubyforge.org/wiki/wiki.pl?RubyGems).
newton:~# wget http://rubyforge.org/frs/download.php/5207/rubygems-0.8.11.tgz
Lo descomprimimos con tar xvfz rubygems-0.8.11.tgz como es usual, y entrando en la carpeta, ejecutamos lo siguiente:
newton:~/rubygems-0.8.11# ruby setup.rb
Si todo ha ido bien debería aparecer algo como esto:
Successfully built RubyGem
Name: sources
Version: 0.0.1
File: sources-0.0.1.gem
Instalamos entonces rails, contestando afirmativamente a la instalación de las dependencias necesarias, como se muestra:
newton:~/rubygems-0.8.11# gem install rails
Attempting local installation of 'rails'
Local gem file not found: rails*.gem
Attempting remote installation of 'rails'
Updating Gem source index for: http://gems.rubyforge.org
Install required dependency rake? [Yn] y
Install required dependency activesupport? [Yn]
Install required dependency activerecord? [Yn]
Install required dependency actionpack? [Yn]
Install required dependency actionmailer? [Yn]
Install required dependency actionwebservice? [Yn]
Successfully installed rails-0.14.3
Successfully installed rake-0.6.2
Successfully installed activesupport-1.2.3
Successfully installed activerecord-1.13.0
Successfully installed actionpack-1.11.0
Successfully installed actionmailer-1.1.3
Successfully installed actionwebservice-0.9.3
Installing RDoc documentation for rake-0.6.2...
Installing RDoc documentation for activesupport-1.2.3...
Installing RDoc documentation for activerecord-1.13.0...
lib/active_record.rb:73:64: Skipping require of dynamic string: "active_record/connection_adapters/#{adapter}_adapter"
Installing RDoc documentation for actionpack-1.11.0...
lib/action_controller/assertions.rb:4:69: Skipping require of dynamic string: "#{File.dirname(__FILE__)}/vendor/html-scanner/html/document"
Installing RDoc documentation for actionmailer-1.1.3...
Installing RDoc documentation for actionwebservice-0.9.3...
Procedemos entonces a instalar la librería FastCGI para Ruby
newton:~/rubygems-0.8.11# apt-get install libfcgi-ruby1.8
Y también el módulo para apache 1.3:
newton:~/rubygems-0.8.11# apt-get install libapache-mod-fastcgi
O para apache 2.0:
newton:~/rubygems-0.8.11# apt-get install libapache2-mod-fastcgi
En Apache 1.3, deberemos editar el /etc/apache/modules.conf, incluyendo la siguiente línea:
LoadModule fastcgi_module /usr/lib/apache/1.3/mod_fastcgi.so
En Apache 2.0, debemos crear un link simbólico de mod-available a mod-enabled, de la siguiente forma:
newton:~/rubygems-0.8.11# ln -s /etc/apache2/mods-available/fastcgi.* /etc/apache2/mods-enabled/
Podemos añadir un VirtualHost en apache para alojar nuestra aplicación RoR.
newton:~/rubygems-0.8.11# pico /etc/apache/httpd.conf
ServerName rubyonrails.gra2.com
DocumentRoot /var/www/rubyonrails/public
Una vez hecho esto y reiniciado Apache, procedemos a crear una nueva aplicación, usando el siguiente comando en el directorio que se desee:
newton:/var/www# rails rubyonrails
Por último, debemos tener en cuenta que por defecto, rails usa CGI (dispatch.cgi) y no FastCGI, así que deberemos cambiar en el directorio public/ de la aplicación, en el .htaccess el RewriteRule, buscando la línea:
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
Sustituyéndola por:
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
Ruby on Rails sugiere crear 3 bases de datos para cada aplicación, una para desarrollo, otra para test y otra para producción, aunque si sólo queremos usarlo para hacer pruebas nos bastaría con una. Al parecer las identifica como *_development, *_test y *_production. Crearemos nuestra base de datos con el nombre rubyonrails.
Creamos estas 3 bases de datos en MySQL, dando permisos totales al usuario de ror:
mysql> CREATE DATABASE `rubyonrails_development` ;
mysql> CREATE DATABASE `rubyonrails_test` ;
mysql> CREATE DATABASE `rubyonrails_production` ;
mysql> GRANT ALL on rubyonrails_development TO ror@localhost IDENTIFIED BY 'password';
mysql> GRANT ALL on rubyonrails_test TO ror@localhost IDENTIFIED BY 'password';
mysql> GRANT ALL on rubyonrails_production TO ror@localhost IDENTIFIED BY 'password';
Le indicamos a RoR la configuración de nuestras bases de datos:
newton:/var/www/rubyonrails# pico config/database.yml
development:
adapter: mysql
database: rubyonrails_development
username: ror
password: password
socket: /var/run/mysqld/mysqld.sock
test:
adapter: mysql
database: rubyonrails_test
username: ror
password: password
socket: /var/run/mysqld/mysqld.sock
production:
adapter: mysql
database: rubyonrails_production
username: ror
password: password
socket: /var/run/mysqld/mysqld.sock
Aquí finalizaría la parte *necesaria* para tener Ruby on Rails listo, a continuación
Para usarla en nuestro programa de ejemplo, crearemos la siguiente tabla:
CREATE TABLE `personas` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(50) NOT NULL default '',
`country` varchar(70) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;
Y añadimos esta entrada de ejemplo:
INSERT INTO `personas` VALUES (1, 'Daniel', 'Spain');
Creamos un Controller con 4 rutinas, list, new, view y edit.newton:/var/www/rubyonrails# ./script/generate controller Friends list view new edit
Creamos el modelo, que representa a una tabla de una base de datos:
newton:/var/www/rubyonrails# ./script/generate model Persona
Editamos la rutina view de nuestro controlador Friends, introduciendo algo como lo siguiente:
newton:/var/www/rubyonrails# pico app/views/friends/view.rhtml
Friends#view Esta página muestra nuestras entradas de la tabla de personasAhora debemos indicar qué es el objeto persona, editando
<%= @persona.name %>
<%= @persona.country %>
app/controllers/friends_controller.rb
newton:/var/www/rubyonrails# pico app/controllers/friends_controller.rbdef view
@persona = Persona.find(1)
end
Podemos visitar nuestra
primera aplicación en RoR en: http://localhost/friends/view
Siento que el ejemplo sea tan malo, pero creo que os puede dar una idea sobre este lenguaje que promete muchísimo.Intentaré (si el tiempo me lo permite), ampliar mis conocimientos en RoR y ofreceros algún otro ejemplo más significativo.

