Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby

Cantando con Sinatra

by
Read Time:7 minsLanguages:
This post is part of a series called Singing with Sinatra.
Singing With Sinatra: The Recall App

Spanish (Español) translation by Andrea J (you can also view the original English article)

Bienvenido a la pista 1 de "Cantando con Sinatra". En esta miniserie hablaremos de Sinatra; un DSL pequeño pero increíblemente poderoso para crear rápidamente aplicaciones web Ruby. En esta parte, empezaremos con Sinatra jugando con algunas rutas, aprendiendo a acceder a los parámetros de URL y cómo POST (publicar) datos entre páginas.

Si no has trabajado antes con Ruby, deberías revisar la sesión de Ruby para principiantes, donde Andrew te guiará a través del proceso de instalación de Ruby en tu sistema y aprender los conceptos básicos del lenguaje.

Lo primero que tenemos que hacer es instalar el RubyGem de Sinatra. Ingresa lo siguiente en la Terminal:

También instala la gema 'shotgun', que usaremos más adelante:

Dependiendo de cómo hayas configurado RubyGems en tu sistema, es posible que debas anteponer el comando gem install con sudo.


Lo más básico

Abre tu editor de texto y crea un nuevo archivo llamado basics.rb. Justo en la parte superior necesitamos requerir RubyGems y la gema Sinatra:

Nota: Si estás ejecutando Ruby 1.9 (que debería ser ;)), puedes eliminar la línea require 'rubygems' ya que Ruby carga automáticamente RubyGems de todos modos.

Comencemos creando el clásico "Hola mundo". Agrega lo siguiente a tu archivo de aplicación basics.rb:

Esta es una "Ruta". Aquí, le estamos diciendo a Sinatra que si se solicita la URL de inicio o raíz '/', utilizando el método HTTP GET normal, se mostrará "¡Hola, mundo!"

Ahora, en la terminal, iniciemos el servidor escribiendo ruby basics.rb. Nos dicen que Sinatra ha "subido al escenario" en el puerto 4567, y si vamos a http://localhost:4567/ en un navegador, vemos "¡Hola, Mundo!".

Intentemos con otra página:

Cada vez que realices un cambio en tu aplicación Sinatra tendrás que reiniciar el servidor.

Esto significa que si se solicita la DIRECCIÓN URL '/about' (usando el método HTTP GET), se mostrará "Un poco sobre mí".

Cada vez que realices un cambio en tu aplicación Sinatra tendrás que reiniciar el servidor. Así que para ahorrarnos la molestia de detener constantemente e iniciar el servidor durante el desarrollo, usaremos la gema Shotgun que instalamos anteriormente.

Detén el servidor Sinatra actual con Ctrl-C. Ahora podemos ejecutar shotgun basics.rb y Shotgun reiniciará automáticamente el servidor cada vez que actualicemos la página. Esto es útil cuando estamos haciendo mucho trabajo de desarrollo, pero como toda la aplicación se está reiniciando, puede ser lento.

Como Shotgun está escuchando en un puerto diferente, pasemos al puerto 9393 y vayamos a http://localhost:9393/about en tu navegador. Deberías ver la frase que configuramos.


Acceder a los parámetros de URL

También puedes acceder a los parámetros desde la dirección URL. Agrega lo siguiente al archivo basics.rb:

En este ejemplo, tenemos una ruta donde cualquier cosa después de '/hello/' se incluirá en una matriz params con la clave :name. La matriz params contiene todas las variables GET y POST. Si vienes de un entorno PHP, esto es similar a la matriz global $_REQUEST.

En el navegador, ve a, por ejemplo, http://localhost:9393/hello/dan y deberías ver el nombre mostrado ("dan").

Puedes incorporar el :name en una cadena envolviéndolo en ${...}. Intenta reemplazar la línea params[:name] por:

Como era de esperar, podemos usar todos los métodos Ruby normales en la variable, como .upcase, .reverse, entre otros.

Puedes configurar la ruta para aceptar varias variables de cadena de consulta de la siguiente forma:

Además de las variables normales en una URL, Sinatra te permite incluir la recuperación de cadenas de consulta comodín, conocidas como 'splat', mediante el uso de un asterisco como este:

Cualquier cosa incluida en la URL después de /more/ será accesible a través de la clave :splat en la matriz params.


Ver archivos y POST

Ahora hagamos algo un poco más interesante. Crearemos un formulario para recuperar datos del usuario y, después, haremos algo con ellos. También haremos uso de un "archivo de vista", que nos permite dividir el marcado de una vista en un archivo independiente. Agrega la siguiente ruta al archivo de aplicación basics.rb:

Esta ruta cargará el archivo form.erb ERB (Ruby incrustado) desde un directorio views/. Los archivos ERB suelen ser archivos HTML normales que te permiten incluir código Ruby dentro de las  etiquetas, las cuales se analizarán antes de enviarse al navegador, al igual que incluyes el código PHP o ASP en una página web.

Así que crea un directorio views/ en la misma carpeta que el archivo basics.rb. Y dentro de views/, crea el archivo denominado form.erb con el siguiente contenido dentro:

Apunta tu navegador a http://localhost:9393/form y deberías ver el mensaje que configuramos en el archivo de vista.

Ya sabemos que todo está funcionando, cambia el contenido de ese archivo a:

Actualiza la página y deberías ver el formulario:

Sin embargo, escribe un mensaje en el cuadro de texto y haz clic en el botón enviar y verás la página de error de Sinatra informándonos que no existe una ruta para esta URL.

Es posible que te preguntes por qué sucede esto, ya que el formulario se envía a /form, la misma URL en la que se encuentra el formulario, por lo que no debería haber ningún problema. Bueno, la diferencia es que estamos recuperando esta página a través del método POST HTTP y, como puedes ver en la página de error que nos presenta Sinatra, Sinatra requiere una ruta diferente para cada método HTTP.

Así que agrega la siguiente ruta a la aplicación Sinatra:

Esta ruta es para el método POST, no GET. Además, todas las variables POST están disponibles en la misma matriz params que las variables GET, por lo que podemos recuperar el mensaje enviado con el formulario. ¡Pruébalo!


¡Ya podrías trabajar totalmente para el MI5!

¿Y qué sigue? Creemos una forma de 'encriptar' un mensaje que enviamos para que solo pueda ser leído por nuestro destinatario. Agrega la siguiente ruta a la aplicación Sinatra:

Probablemente ya te estés acostumbrando a esto. Esta ruta cargará el archivo de vista ERB en views/secret.erb. Crea ese archivo de vista con lo siguiente:

Y crea la ruta para el método POST:

Bien, ya tenemos un cifrador de mensajes que usa un método especial 'inverso' para hacer que el mensaje parezca ilegible, necesitamos una forma de descifrar el mensaje:

¡Ahí lo tienes! Un cifrador de mensajes súper secreto y altamente seguro lo suficientemente bueno para la agencia de inteligencia de cualquier país.

Descargo de responsabilidad legal: cuando decimos "altamente seguro" y "cifrado", en realidad solo estamos invirtiendo las letras. Lo siento.


¿4Oh4?

Una última cosa que tocaremos son las páginas de error 404. En este momento, si vas a una URL para la que no hay una ruta (por ejemplo, /danisthebest), verás el elegante mensaje de error de Sinatra. En una aplicación real, querríamos mostrar nuestro propio error. Para hacer esto, simplemente usa la ruta not_found, así:

Aquí estamos usando el método de estado de Sinatra para configurar el código HTTP status de la página en 404 (puedes usar este mismo método para configurar cualquier código de estado, como 201 cuando se crea algo, o 403 cuando no se pudo iniciar sesión).

Podrías refactorizar aún más la ruta not_found usando el método halt de Sinatra:


Conclusión

¡Así que realizaste tu primer dueto con Sinatra! Con suerte, puedes ver lo fácil que es crear aplicaciones web con este DSL.

En la siguiente pista, crearemos una aplicación simple de "tareas pendientes" conectada a una base de datos SQLite. También hablaremos de los elusivos métodos PUT y DELETE HTTP de los que nadie ha oído hablar.

Nota: Puedes examinar los archivos del proyecto final de este tutorial en GitHub.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.