Link Search Menu Expand Document

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