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.
1234567 require'sinatra/base' classMyApp<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.
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:30001234567 $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.
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.
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 end1234567891011 classMyApp<Sinatra::Base get'/'do "Hola, Subclass" endend classSegundoApp<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:
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.
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!