post thumbnail

Sinatra desde Cero: Aplicaciones modulares

Publicado Por: Alberto Grespan, El 28/11/2013


Detalles del Curso:

Dificultad: Aprendiz

Duración: 25 min


La serie de Sinatra desde Cero, buscará otorgarte el conocimiento necesario para que puedas desarrollar tus propias aplicaciones Web haciendo uso de esta magnifica herramienta.

En este séptimo capítulo te enseñaremos a plantear tus aplicaciones de manera diferente de como lo hemos venido haciendo hasta ahora y es utilizando subclases. las subclases nos ayudan a tener aplicaciones modulares más desacopladas y ordenadas.

Para comprender correctamente todo lo que hablaremos en esta serie, es conveniente tener un conocimiento básico sobre el lenguaje de Ruby. Podrás conseguir toda la información desees aquí


Aplicaciones modulares

Hasta este punto de la Serie Sinatra desde Cero, hemos visto como se ensambla una aplicación en Sinatra utilizando el "top level DSL" require "sinatra"; esta manera funciona muy bien cuando las aplicaciones son de pequeño tamaño o su funcionalidad es muy puntual, pero cuando comienzan a crecer nos veremos en la obligación de tener una aplicación más modular haciendo uso del Subclassing de Sinatra permitiéndonos la separación de componentes.

Entre los pro y los contra de las aplicaciones modulares vs las "clásicas" podríamos mencionar que: las aplicaciones clásicas son más simples de construir y se conoce cual será su estructura de proyecto; pero por el contrario las aplicaciones modulares son algo más complicadas de construir pero más flexibles con su estructura del proyecto ya que se encuentran más desacoplados sus componentes, pero muchas veces provocan diferentes tendencias de como se debe armar un proyecto de gran magnitud diverjan y terminemos con una estructura similar o igual a la de un proyecto hecho en Ruby on Rails, cuando simplemente pudimos haber comenzado utilizando en ese framework.

En fin, realicemos una aplicación modular para observar y aprender como se hacen.

Subclase de Sinatra

Para utilizar Sinatra como una subclase debemos hacer lo siguiente:

Primero creamos un archivo que se llame server.rb con el siguiente código.

require 'sinatra/base'

class MyApp < Sinatra::Base
  get '/' do
    "Hola, Subclass"
  end
end

Podemos observar que prácticamente es el mismo esqueleto de una aplicación clásica pero utiliza sinatra/base en vez de sinatra y nuestra aplicación se encuentra en una clase llamada MyApp que hereda de Sinatra::Base la cual contiene las rutas de nuestra aplicación.

Posterior a esto debemos crear otro archivo con el nombre config.ru con el siguiente código.

require "./server"
run MyApp

Debemos recordar que el nombre de archivo config.ru es una convención de nombre utilizado por las aplicaciones que usan Rack como base.

Como estamos utilizando las bondades de Rack debemos encender el servidor de la siguiente manera

$ rackup -s puma -p 3000

# nos imprime
Puma 2.6.0 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:3000

Podemos utilizar otro servidor que no sea puma, algo como unicorn o webrick si los tenemos instalados de la siguiente manera.

$ rackup -s webrick -p 3000

# nos imprime
[2013-11-27 21:42:43] INFO  WEBrick 1.3.1
[2013-11-27 21:42:43] INFO  ruby 2.0.0 (2013-06-27) [x86_64-darwin12.4.1]
[2013-11-27 21:42:43] INFO  WEBrick::HTTPServer#start: pid=89169 port=3000
^C[2013-11-27 21:42:45] INFO  going to shutdown ...
[2013-11-27 21:42:45] INFO  WEBrick::HTTPServer#start done.

Les recomiendo ver todas las posibilidades que nos entrega el comando rackup utilizando la bandera -h.

Ahora si vamos a internet o hacemos un cURL podemos observar que la pequeña aplicación hecha con un Subclass de Sinatra nos arroja la información correcta Hola, Subclass en la pantalla.

$ curl --request GET localhost:3000/
Hola, Subclass%

Ahora que sabemos sobre Subclases en Sinatra debemos tener presente que todas las Rutas de la aplicación se pueden heredar mediante Subclases, ya sean para manejo de errores, extensiones, middleware, etc…

Vamos a realizar una pequeña prueba para que vean como se puede heredar utilizando subclases de una clase propia que creemos.

class MyApp < Sinatra::Base
  get '/' do
    "Hola, Subclass"
  end
end

class SegundoApp < MyApp
  get '/hola' do
    "Hola desde nuestra segunda subclase."
  end
end

Hemos creado dentro del mismo archivo una segunda clase llamada SengundoApp con una ruta llamada /hola que imprime un texto.

Los cambios que tuvimos que realizar en nuestro config.ru son los siguientes:

require 'sinatra/base'

require "./server"
run SegundoApp

Podemos apreciar que no mucho cambió, decidí que la linea de require "sinatra/base" se encontraba mejor en este archivo para no tener que agregarlo a cada uno de los archivos que creemos, por último estamos haciendo run SendundoApp ya que es la última subclase y contiene todas las anteriores. Fueron cambios sencillos y fáciles de entender, vamos a probar en el terminal lo que nos mostraría por pantalla las rutas.

$ curl --request GET localhost:3000/
Hola, Subclass%

$ curl --request GET localhost:3000/hola
Hola desde nuestra segunda subclase.%

De manera muy sencilla hemos creado una aplicación que pudiese encontrarse en 2 archivos distintos y que contendría una ruta cada uno. La semana entrante veremos como crear una pequeña aplicación con estructura similar a la de Rails para el manejo de los controladores usando Subclases.


Conclusión

En este séptimo capítulo, hemos aprendido a utilizar de manera muy básica Subclassing en Sinatra, para implementar nuestras aplicaciones con mayor libertad. Si te surge algún tipo de duda no te detengas y déjanos un comentario, que gustosamente lo responderemos.

¡Hasta el próximo capítulo!


¿Te ha gustado esta publicación?

Compártela:

Por Alberto Grespan

Conoce más sobre este autor aquí


comments powered by Disqus