Revista Informática

Sinatra desde Cero: Aplicaciones modulares

Publicado el 28 noviembre 2013 por Codehero @codeheroblog

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

1234567 require'sinatra/base' classMyApp&lt;Sinatra::Base  get'/'do  "Hola, Subclass"  endend

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

12 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

1234567 $rackup-spuma-p3000 # nos imprimePuma2.6.0starting*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.

12345678 $rackup-swebrick-p3000 # nos imprime[2013-11-2721:42:43]INFO  WEBrick1.3.1[2013-11-2721:42:43]INFO  ruby2.0.0(2013-06-27)[x86_64-darwin124.1][2013-11-2721:42:43]INFO  WEBrick::HTTPServer#start: pid=89169 port=3000^C[2013-11-2721:42:45]INFO  going toshutdown[2013-11-2721: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%

12 $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

1234567891011 classMyApp&lt;Sinatra::Base  get'/'do  "Hola, Subclass"  endend classSegundoApp&lt;MyApp  get'/hola'do  "Hola desde nuestra segunda subclase."  endend

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

1234 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.%

12345 $curl--request GET localhost:3000/Hola,Subclass% $curl--request GET localhost:3000/holaHola 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!


Volver a la Portada de Logo Paperblog