8.6. Ruby
8.6.1. Características del lenguaje Ruby
Fecha de aparición: 1995
Perspectivas:
- Uso y popularidad creciente.
- Base de programadores fiel y especializada.
- Excelente relación señal/ruido.
- Aún tiene algunos problemas por resolver: El lenguaje todavía está en fase de importantes cambios, tiene peor rendimiento que Python o PHP y muchos módulos (gemas) están mal documentados.
Filosofía:
- Completa –y verdaderamente– orientado a objetos. Todo es un objeto.
- Admite otros paradigmas ocultos bajo los objetos.
- “Rápido y fácil”. Es un lenguaje divertido: de programadores para programadores.
- Curva de aprendizaje larga pero nunca abrupta.
- Potente sistema de expresiones regulares.
- En combinación con Rails, ideal para desarrollo web MVC rápido y basado en prototipos.
¿Y Ruby on Rails?
Rails, también conocido como Ruby-on-rails, es un framework para desarrollar aplicaciones web MVC con Ruby.
Apareció en 2004 y gustó tanto que otros frameworks para otros lenguajes (como Laravel para PHP) se han inspirado en su forma de trabajar: abundantes capas de abstracción para evitar tareas de bajo nivel, scaffolding, integración con Ajax, Convention over Configuration (CoC) y Don’t Repeat Yourself (DRY).
Rails se hizo tan famoso que mucha gente, aún hoy en día, confunde el lenguaje (Ruby) con el framework (Ruby on Rails).
8.6.2. Configuración necesaria en el servidor
Para poder ejecutar scripts en Ruby en un servidor web Apache o similar, necesitarás:
- Instalar el intérprete Ruby en el sistema.
- Instalar el módulo de Ruby (mod_ruby) y/o el módulo cgi (mod_cgi) para Apache.
- Configurar el manejador de Apache para CGI.
- Instalar módulos adicionales para Ruby (como cgi o mysql) si son necesarios.
Como en el caso de Perl o Python, Ruby puede correr de forma nativa en Apache (más rápido pero menos frecuente) o como script CGI.
8.6.3. Sintaxis básica de Ruby
En Ruby, no es necesario declarar las variables. El tipado es dinámico (tipo duck: si anda como un pato y parece un pato, es que es un pato).
Todo es un objeto en este lenguaje, incluso números enteros o los valores constantes, lo cual conduce a expresiones chocantes como estas:
5.isEven?
"cadena".lenght
variable_cadena.chop!
Ruby está lleno de convenciones para evitar tener que llenar la documentación de explicaciones innecesarias (a esto se le llama “filosofía CoC” = Convention over Configuracion). Por ejemplo:
- Es una convención que todos los métodos cuyo nombre termine en una interrogación, deben devolver un booleano. En el ejemplo anterior, el método isEven es uno de ellos.
- Otra convención es que todos los métodos cuyo nombre termine en una admiración, modificarán irreversiblemente el objeto con el que se invocan. En el ejemplo anterior, el método chop! troceará la cadena cada vez que encuentre un espacio en blanco en su interior, convirtiéndola en un array de cadenas.
Los operadores de Ruby son los habituales:
Comparación: ==, <, >, <=, >=, =, !=
Asignación: =
Las estructuras de control también te resultarán familiares. No se utilizan llaves ({…}) para marcar los bloques, sino que cada bloque finaliza con la palabra end. El sangrado es optativo pero, por supuesto, muy recomendable.
while condicion
Acciones
end
if condicion
Acciones-1
else
Acciones-2
end
Sin embargo, el uso de bucles clásicos casi siempre puede sustituirse por iteradores sobre objetos, algo cada vez más frecuente en los lenguajes orientados a objetos:
variable_array.do_each
...
end
num_rows.times do
...
end
8.6.4. Entrada / Salida
La entrada de datos a través de un formulario HTML se hace usando un objeto de la clase CGI. La salida, con una sencilla sentencia print:
// Leer datos de un formulario
require "cgi"
cgi = CGI.new
variable = cgi["campo"];
// Salida de datos
print "cadena", variable, "cadena2", ...
8.6.5. Bibliotecas, clases y métodos
Las clases en Ruby se declaran de forma muy semejante a Python (observa cómo el símbolo “<” indica herencia):
class nombre_clase < clase-madre
def nombre(parametros)
Acciones;
end
end
Las clases se pueden agrupar en módulos llamados “gemas” (gems). Una gema se puede incluir en nuestro código así:
include "nombre_gema"
8.6.6. Ejemplo 1 en Ruby: Hola mundo
#!/usr/bin/ruby
print "Content-Type: text/html\n\n"
print "<html><body>"
print "<h1>Hola, mundo</h1>"
print "</body></html>"
8.6.7. Ejemplo 2 en Ruby: login con comprobación de email por Ajax
Una vez más, solo mostraremos el script del lado del servidor (login.rb). Para revisar el código del lado del cliente, puedes acudir a la sección dedicada al lenguaje Perl, y sustituir la referencia al script login.pl por login.rb. El resto del código permanecerá idéntico.
#!/usr/bin/ruby
require "mysql"
require "cgi"
begin
# Conexión con la base de datos
con = Mysql.new 'server', 'db-user', 'db-password', 'db-name'
# Recuperamos la información del formulario HTML
cgi = CGI.new
name = cgi["username"]
pass = cgi["password"]
# Consultamos la base de datos
res = con.query("SELECT id FROM users WHERE user = '#{name}' AND password = '#{pass}'")
# Generamos la salida JSON para el cliente
print "Content-type: application/json\n\n"
if res.num_rows == 0
print %Q!{"error": "Username or password not valid"}!
else
row = res.fetch_hash
print %Q!{"success": "Authentication is OK", "userid": "#{row['id']}" }!
end
con.close if con
end