Tutoriales

Conoces Pow?

rails ruby ror pow servidor

Has escuchado acerca de Pow?

Es un servidor web de Ruby (Rack) de cero-configuración. Esto significa que no necesitas hacer nada!
(de hecho, casi nada)

Por lo tanto, mi pregunta es:

Y_U_NO_USING_POW

De verdad, deberías estar usándolo!. Alguna de sus ventajas:

  • Facilita trabajar con múltiples proyectos.
  • Nos evita tener que "establecer" puertos para cada aplicación
  • URIs como si estuvieramos en Producción
  • http://blog.dev se ve mucho mejor que http://localhost:3000
  • Aplicaciones que necesitan otros servicios se pueden comunicar localmente mas fácil (con dominios .dev y evitando el problema de usar puertos para cada servicio)
  • No se necesita tener una fea consola para ejecutar el servidor web! (por cada proyecto)
  • Estándares, dentro de tu empresa se pueden definir mejores prácticas
  • No agrega dependecias al proyecto, por lo tanto, porqué no usarlo?

A continuación te muestro los pasos que necesitas para hacerlo funcionar:

Instalación

Para Mac OS X:

curl get.pow.cx | sh

Como puedes ver, es tan fácil como solo ejecutar un simple comando!

* Para Ubuntu (y otros sistemas GNU/Linux) escribiré un post con las instrucciones correctas pronto, mantente al tanto.

Uso

Ahora, solo abre en tu navegador web algun dominio .dev

Por ejemplo, para este blog deberemos usar la dirección http://blog.dev, lo que nos deberá mostrar algo parecido a:

symlink

* Si usas Google Chrome, deberás escribir la URI completa, con el protocolo http:// o de otra manera, Chrome tratará de buscar el término (esto debido a que .dev no es un TLD).

Crear el enlace (symlink)

Tal como las instrucciones en la página de "error" de Pow lo indican, para hacerlo funcionar solo debemos crear un enlace (symlink)! Fácil no?

Entonces, si tu aplicación está en el directorio repos/blog, deberás usar algo como:

ln -s ~/repos/blog ~/.pow/blog

Una vez creado, solo recarga la página y ya debe estar listo :)

Reiniciar el servidor

Como Pow se ejecuta en modo "development", la mayoría de las veces no necesitaremos hacer nada.

Pero si has agregado una nueva gema, un initializer o simplmente quieres reiniciar el servidor para ver si se arregla algún error, tan solo tienes que ejecutar:

touch tmp/restart.txt

Esto hará que Pow recargue la aplicación.

Viendo los logs

En algunas ocasiones, necesitamos consultar los logs del servidor.
Aún si estamos usando Pow y no tenemos la consola siempre visible, se pueden consultar los logs que Rails genera usando:

tail -f logs/development.log

Powder

Si no te gusta tener que recordar (y escribir) todo estos comando, puedes usar tambien una gema que hace mas fácil el manejo de Pow: Powder

Sólo instala la gema:

gem install powder

Powder tiene muchos comandos a usar (revisa el README de Powder para mas información):

$ powder up       # Habilitar Pow
$ powder down     # Deshabilitar Pow
$ powder restart  # Reiniciar la aplicación
$ powder applog   # Mostrar el log de la aplicación
$ powder list     # Mostrar todas las aplicaciones de Pow
$ powder open     # Abrir la aplicación actual en el navegador

Entonces, te gusta Pow?

Recuerda: cada vez que un navegador abre una página como: un unicornio muere! :(

Más información:

  • http://pow.cx/manual.html
  • https://github.com/Rodreegez/powder

Recuerda contactarme si tienes algún comentario, sugerencia o duda:

  • Email: gonzalo.fernandez@crowdint.com
  • Twitter: @chalofa
  • or even better, with a comment in this post!

Comentarios »

Mountable Engines en Rails

rails ruby ror mountable engines

Ruby on Rails 3 proporciona un nuevo mecanismo para separar nuestras aplicaciones:
Rails Mountable Engines.

De acuerdo a la documentación de Rails:

Rails::Engine te facilita agrupar aplicaciones específicas de Rails o sub-grupos de funcionalidad y compartirlos con otras aplicaciones.

Desde Rails 3.0, cada Rails::Application es tan solo un engine, lo que permite tener funcionalidad mas simple y compartir entre aplicaciones.

Para crear un Mountable Engine, con RSpec and Cucumber para para los tests, sigue estos pasos:

Pre-requisitos:

  • Rails 3.x (recomendado usar la última version: 3.2.2 ahora)

Crear un Mountable Engine de Rails:

rails plugin new shinyapp --mountable -d sqlite3 -T --dummy-path=spec/dummy

Esto creará Shinyapp como un Mountable Engine, con base de datos SQLite y la aplicación dummy en el directorio: spec/dummy (en lugar del default: test/dummy)

Cambiando el GemSpec:

En nuestro ejemplo: shinyapp.gemspec. Cambiar los siguientes valores con datos reales:

  • Pagina web
  • Autores
  • Emails
  • Descripción and Resumen

Si no se cambian estos valores ahora, al montar la gema sobre una aplicación real generará warnings al ejecutar: bundle install.

RSpec

Primero agrega la gema de RSpec a tu GemSpec (en nuestro caso shinyapp.gemspec) como una dependencia de desarrollo:

 s.add_development_dependency 'rspec-rails'

Instala la gema y crea la configuración por default para el spec_helper.rb:

bundle
rails generate rspec:install

Ahora necesitarás cambiar el spec_helper.rb para adaptarlo a un Mountable Engine (es decir, que use la aplicación dummy):

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../dummy/config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[File.join(ENGINE_RAILS_ROOT, 'spec/support/**/*.rb')].each {|f| require f }

Puedes ver un ejemplo del spec_helper.rb que usamos en el engine de CrowdBlog.

Configura la tarea rake spec para que se ejecute en la acción por default de Rake.
Para esto, cambia en el Rakefile:

require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec)

# RSpec as default
task :default => :spec

Y eso es todo para RSpec!

Para comprobar que funciona, ahora es buen momento para crear una prueba. Un buen inicio es creando: spec/helpers/application_helper_spec.rb

Cucumber

De nuevo, primero debemos agregar la gema de Cucumber a nuestro GemSpec (en este caso shinyapp.gemspec) como una dependencia de development:

s.add_development_dependency 'cucumber-rails'
s.add_development_dependency 'database_cleaner'

Instalar la gema y generar la configuración por default para Cucumber:

bundle
rails generate cucumber:install

Esto crea el archivo lib/tasks/cucumber.rake que esta bien para una app Rails normal, pero no para los Mountable Engine (cuando se usa, ejecutará los tests multiples veces).

Para arreglar esto, mueve el archivo cucumber.rake a la dummy app:

mkdir -p spec/dummy/lib/tasks   # create the directory if not present
mv lib/tasks/cucumber.rake spec/dummy/lib/tasks

Cambia el env.rb adaptandolo a un Mountable Engine (lo haremos que use la dummy app):

# Added this as explained in: http://bit.ly/uJv9M7
ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../../spec/dummy/config/environment.rb",  __FILE__)
ENV["RAILS_ROOT"] ||= File.dirname(__FILE__) + "../../../spec/dummy"

Puedes ver un ejemplo del env.rb que usamos en el engine de CrowdBlog.

Ahora tenemos que habilitar los helpers de las rutas de Rails en Cucumber (ya que no son cargadas por default).
Edita el archivo env.rb, agregando estas lineas al final:

# include Engine routes in Cucumber world
module EngineRoutesHelper
  include Shinyapp::Engine.routes.url_helpers
end
World(EngineRoutesHelper)

Finalmente, hay que configurar rake app:cucumber con el alias mas común de cucumber y hacerlo que sea ejecutado por la acción de default Rake:

task :cucumber => 'app:cucumber'
task :default => [:spec, :cucumber]

Y eso es todo para Cucumber!

Bibliografía:

  • http://reinteractive.net/posts/2-start-your-engines
  • http://brainbicycle.net/blog/2011/10/03/create-a-rails-engine-with-rspec-and-capybara-tests/
  • http://apidock.com/rails/Rails/Engine

Espero les haya gustado este post, espero escribir otro proximamente explicando cuando es una buena idea usar un Rails Mountable Engine para separar funcionalidad de una Rails app.

Recuerda contactarme si tienes algún comentario, sugerencia o duda:

  • Email: gonzalo.fernandez@crowdint.com
  • Twitter: @chalofa
  • o mejor aún, con un comentario en este post!

Comentarios »

En marcha con Ruby on Rails

rails3 tutorial scaffolding principiantes

En marcha con Ruby on Rails

Esta es una traducción del post Rolling with Ruby on Rails de Bill Walton y Curt Hibbs, adaptada para Rails 3

Probablemente hayas escuchado acerca de Ruby on Rails, la manera super productiva de desarrollar aplicaciones web, y te gustaría probarlo, pero no conoces nada acerca de Ruby on Rails.

Así es como la versión original de "En marcha con Ruby on Rails", publicada hace casi cinco años (enero 2005) comenzaba. Y era cierto. Ruby on Rails (o simplemente Rails) era super productivo y divertido. Una comunidad creciente de contribuidores llegó para hacerla aún más productiva y divertida. Rails ha crecido rápido. Tiene capacidades que debes de ver, y es po lo que estamos aquí.

Al igual que la versión original, este tutorial te mostrará cómo desarollar una aplicación basada en web y manejada por una base de datos usando Ruby on Rails. También, como el original, no te enseñará a programar en Ruby. Por otra parte, si ya sabes programar en algún otro lenguaje de programación orientado a objetos, no deberías de tener problema alguno siguiendo el tutorial, y al final encontrarás links acerca de Ruby y más.

Antes de subir tus mangas, me gustaría contestar un par de preguntas.

¿Qué es Ruby?

Ruby es un lenguaje de programación orientado a objetos puro con una sintaxis extremadamente clara que hace la programación elegante y divertida. Ruby combina exitosamente la elegancia conceptual de Smalltalk, la facilidad de uso y de aprendizaje de Python, y el pragmatismo de Perl. Ruby se originó en Japón a principios de los 90's. Se ha vuelto popular alrededor del mundo en los años pasados en tanto que más documentación y libros en inglés (y ahora en español) se han vuelto disponibles (¡y su popularidad realmente se ha disparado desde la introducción a Rails!)

¿Qué es Rails?

Rails es un framework open-source escrito en Ruby para desarrollar aplicaciones web manejadas por bases de datos. ¿Qué hay de especial en eso? Hay muchas otras docenas de frameworks, y muchos de ellos han existido por más tiempo que Rails. ¿Porqué debería de interesarme en otro framework?

¿Qué pensarías si te dijera que puedes desarrollar una aplicación web al menos 10 veces más rápido que con un framework típico en Java? ¡Es posible --sin sacrificar en absoluto la calidad de la aplicación! ¿Cómo es esto posible?

Parte de la respuesta yace en el lenguaje de programación Ruby. Rails toma completa ventaja de Ruby. El resto de la respuesta se encuentra en dos principios guías de Rails: menos software y convención sobre configuración.

Menos software significa que requieres escribir menos líneas de código para implementar tu aplicación. Manteniendo el código pequeño se traduce en desarrollo más rápido y menos errores, que hace tu código más fácil de entender, mantener y mejorar. Pronto verás cómo Rails corta el peso del desarrollo.

Convención sobre configuración significa el fin de los verbosos archivos de configuración en XML -- ¡no hay niguno! En vez de archivos de configuración, Rails utiliza simples convenciones de programación que permiten conocer todo a través de reflexión y descubrimiento. Tu código de aplicación y tu base de datos actual ya tienen todo lo que Rails necesita saber.

Ver es creer

Los desarrolladores están acostumbrados a escuchar mucho ruido y publicidad cuando sale algo nuevo. Lo sabemos. Somos desarrolladores también, y podemos imaginar ciertamente esa mirada escéptica en tu cara. Super productivo, ¡sí cómo no!

No estamos pidiendo que aceptes esto ciegamente. Te mostraremos cómo lo probarás tú mismo.

Cuando hayas completado este tutorial, pensamos que estarás tanto motivado como listo para "subirte a Rails" para lograr resultados similares por tí mismo. La versión actualizada de este tutorial producirá una aplicación que se muestra y tiene exactamente las mismas características que el original, así que decidimos probar un acercamiento un tanto diferente. En vez de pretender que estamos haciendo esto por primera vez, imaginemos que nuestro jefe camina hacia nuestra oficina justo antes del almuerzo y dice:

Jefe: Hey, RMX (esos somos nosotros). Estoy en un apuro. Realmente necesito de tu ayuda. Se supone que debo hacer algo para impresionar a mi jefe mañana en la mañana. He estado desarrollando una pequeña aplicación. Es algo importante para él, y creo que va a invitar a otras personas a la demostración mañana. Tal vez su jefe. El problema es que he estado usando la ayuda de un consultor externo para esto, y pareciera que se ganó la lotería anoche. No vino a trabajar hoy, no contesta mis correos ni su celular. Y además de eso, la aplicación dejó de funcionar hace unas horas y ni siquiera tengo acceso al código fuente. RMX, esta no es la historia que quiero contar mañana a mi jefe. Me contaron por ahí que has estado tratando de que aprueben una nueva herramienta de desarrollo. ¿Dices que te permite producir código diez veces más rápido que las herramientas que usamos ahora?

RMX: Sí, se llama Ruby on Rails, y es al menos diez veces más rápida. Pero no he tenido éxito con los del departamento de sistemas. Ni siquiera logro que le echen un vistazo. Simplemente no están entusiasmados en intentar algo nuevo por ahora.

Jefe: RMX, realmente necesito que la situación con esta aplicación esté arreglada para mañana en la mañana. Si puedes hacer esto, puedes usar cualquier herramienta que quieras. Sólo dame una aplicación web, con una base de datos, que se vea y actúe como las aplicaciones que mi jefe ha visto. Sé que es mucho. Probablemente estoy pidiendo que te quedes a trabajar tarde. Mañana será un día importante. Te diré qué. Si aceptas intentarlo, haré una llamada, y veré si puedo romper el hielo con los chicos de sistemas.

RMX: (viendo una oportunidad...) Te diré qué. Casi es hora del almuerzo. Si vas a conseguir una pizza, y me permites demostrar qué tan productivos nos puede hacer Rails, creo que puedo solucionar el problema antes de que acabe el almuerzo.

Jefe: ¡No hay manera! ¿Antes de que acabe el almuerzo? ¡Ya estás!

RMX: Tranquilo, jefe. Trae la pizza. Mientras tanto, instalaré Rails. Los de sistemas no me dejarán descargar el software de Rails a través del firewall, así que traje un CD esta mañana. Estaré listo cuando regreses.

Jefe: ¿Dices que tendrás listo un ambiente de desarrollo para el tiempo que yo regrese¡ ¿Y que, mientras comes, reproducirás una aplicación para la cual he tenido a un consultor trabajando por...? ¡Ah, olvídalo! No caeré. RMX, no te ofendas, pero eso es muy difícil de creer. De verdad espero que estés en lo correcto.

Así comienza la historia. El jefe ha ido por pizza, así que debemos apresurarnos a instalar Rails.

Instalando y configurando Rails

En la versión original de este tutorial, Curt nos mostró cómo instalar y configurar Rails en una plataforma Microsoft Windows. En esta actualización, hemos discutido cómo manejar el asunto. Podríamos hacer lo mismo de nuevo, pero ha habido muchas quejas sobre el favoritismo hacia alguna plataforma (¡especialmente Windows!) sobre otras. Alternativamente, podríamos mostrarte cómo instalar y configurar Rails en cada uno de ellos -- Windows, Mac y Linux -- pero eso tomaría mucho espacio. Alternativamente, podríamos tomar ventaja de que, desde el tutorial original, han surgido nuevas herramientas para cada uno de estos ambientes que hacen la instalación y la configuración muy fácil. Podríamos simplemente señalarte esos recursos. Ya que la última opción elimina el favoritismo y requiere menos esfuerzo... bueno, sólo haremos "la cosa más sencilla que pueda funcionar"

Ha pasado mucho tiempo desde el tutorial original, que usaba las primeras versiones de Rails. Para esta guía hemos decidido ser la punta de lanza y utilizar Rails 3, que si bien ha sufrido muchos cambios en su interior, sigue manteniendo las convenciones, que hacen que este tutorial prácticamente se mantenga intacto.

  • Para Windows, usa RubyInstaller
  • Para Mac OSX o Linux, usa RVM
  • Si no deseas instalar Rails, sino probarlo desde un CD, prueba con este LiveCD de Ubuntu listo con Rails3

Con cualquiera de estas opciones estarás listo para comenzar a desarrollar tu primera aplicación de Rails en menos tiempo que tardan en traer la pizza.

¡La pizza llegó!

Jefe: Ok, RMX, aquí está la pizza. Sé que acordamos en que me mostrarías qué tan buena es tu herramienta, pero como no necesito entender cómo funciona a detalle, traje a Pablo conmigo. No me molestaría que profundizaran en los detalles si no hay problema con que lo consideraras un observador. ¿Está bien?

RMX: Seguro, jefe. Hola Pablo. Déjame tomar una rebanada de pizza, y comenzaremos. Dijiste que querías que esto pareciera a la aplicación en la que has estado trabajando. Pero la aplicación no funciona ahora. ¿Qué tienes para que comience a trabajar?

Jefe: Entontré este bosquejo de la página principal en el escritorio del consultor.

Figura 1: nuestra meta Figura 1: nuestra meta.

Básicamente, la aplicación debe de hacer tres cosas:

  • Mostrar una lista de recetas.
  • Crear nuevas recetas y editas las existentes.
  • Asignar una categoría (como "postre" o "sopa")

Aquí hay una nota que encontré en su escritorio sobre cómo funciona la aplicación:

Características requeridas

  • Título - El mismo en todas las páginas.
  • Encabezado - El mismo en todas las páginas.
  • Tabla:
    • Receta - Hacer click en el link nos lleva a una página mostrándonos una vista no editable de la receta. La página tiene links para editar y guardar la receta, y regresar a la página del listado.
    • Borrar - Hacer click en este link borra la receta del sistema y de la página.
    • Categorías - Hacer click hace que la página se refresque con sólo las recetas en dicha categoría incluida.
    • Fecha - La fecha debe ser asignada por el sistema siempre que una nueva receta sea creada o editada.-
  • Pie de página - Aparece en todas las páginas. NOTA: En las páginas de categoría, el link en la derecha deberá decir "Crear nueva categoría". Se deberá comportar similar al link "Crear nueva receta". El resto del pie de página es el mismo en todas las páginas:
    • Crear nueva receta: Hacer click nos lleva a una forma donde introducimos el nombre de la receta, la descripción, las instrucciones, y seleccionamos una categoría a la receta.
    • Mostrar todas las recetas. Este link nos muestra todas las recetas. Esto se usa para restablecer la vista después de que la lista ha sido filtrada por alguna de las categorías.
    • Mostrar todas las categorías - Hacer click en este link nos lleva a una lista de todas las categorías, con link para editar y borrar las categorías existentes. El pie de página debe de contener el link "Crear nueva categoría"

Eso es todo lo que tenemos por ahora.

Escribamos algo de código

RMX: Está bien, comencemos. Una de las cosas que Rails permite, jefe, es un acercamiento incremental e iterativo para el desarrollo. Como verás muy pronto, Rails permite tanto con tan poco esfuerzo que es muy difícil no caer en ese ritmo. En general, seguiremos los mismos pasos para crear una aplicación Rails.

  1. Generar una aplicación web Rails vacía

  2. Decidir si usar la base de datos por default que usa Rails o seleccionar la base de datos que queremos usar.

  3. Si no existe, crear la base de datos que usaremos.

  4. Decidir en qué característica trabajar.

  5. Si no existen, crear las tablas que utilizará dicha característica

  6. Generar el código base que usarán las tablas

  7. Mejorar

  8. Repetir los pasos 4 al 8 hasta que esté terminado

Generar una aplicación web Rails vacía

RMX: Rails es un framework de desarrollo de aplicaciones. Una de las cosas que esto significa es que todas las apliaciones Rails siguen la misma estructura. Rails permite que sea sencillo seguir la convención creando la estructura por nosotros cuando decidimos crear una nueva aplicación. Todo lo que tenemos que hacer es...

Abrir una línea de comando y navegar hasta el directorio donde queremos crear la aplicación. Llamaremos a éste el directorio raíz de Rails. Su nombre variará dependiendo del sistema operativo que usemos, entre otras cosas, pero los nombres y la estructura de los directorios será la misma. A partir de aquí, los directorios que mencionaré se encuentran bajo el directorio raíz.

Entonces, ¿cómo se llamará la aplicación?

Jefe: Ok, llamémosle cookbook2

El jefe, teniendo en mente que si la aplicación le gusta a sus superiores, puede convertirla rápidamente en un producto y lanzarlo en línea, ha decidido que su aplicación esté en inglés, por lo que el consultor ha comenzado su aplicación de esta manera.

En general, es recomendable en inglés, ya que las palabras reservadas en el lenguaje de programación están en dicho idioma. Si deseamos que la aplicación esté en español, o en cualquier otro idioma, ¡no hay ningún problema! Rails posee un módulo de internacionalización, (o I18n, en corto). En tutoriales posteriores veremos que es muy fácil cambiar el idioma de nuestra aplicación, sin afectar para nada su funcionalidad.

Para crear una aplicación vacía, tan sólo corremos el comando

rails new cookbook2 -d mysql

El jefe ha mencionado que el consultor anterior optó por trabajar con MySQL, una base de datos muy popular. El parámetro que hemos pasado, -d, le indica a Rails que prepare los archivos de configuración necesarios para comenzar a usar esa base de datos ahora mismo. Por default, Rails utiliza SQLite, que es una base de datos almacenada en archivos, y que es muy útil para prototipar aplicaciones. Pero para dejar las cosas listas, usaremos MySQL de una buena vez.

Rails crea un subdirectorio cookbook2 bajo el directorio raíz, que contiene un árbol de archivos y carpetas para la aplicación.

La estructura de nuestra aplicación Figura 2: Rails en acción creando un nuevo directorio de aplicaciones

Pablo: Dime más acerca de esta estructura de directorios, RMX. Son muchas carpetas. ¿Vamos a poner código en todas ellas?

RMX: Rails pone el código en la mayoría de ellas, excepto los subdirectorios dentro de app. Rails usa el paradigma de Modelo-Vista-Controlador para organizar el código fuente.

  • El directorio app/controllers es done Rails busca las clases del controlador. El controlador maneja la petición desde el usuario

  • El directorio app/views contiene los templates para llenar con datos de nuestra aplicación, convertirla en HTML (o el formato adecuado) y regresarlo al navegador

  • El directorio app/models contiene las clases que modelan e involucran los datos usados en nuestra base de datos. En la mayoría de los frameworks, esta parte de la aplicación puede volverse grande, caótica, tediosa, verbosa y propensa a errores. ¡Rails convierte esto en algo tan fácil!

  • El directorio app/helpers contiene cualquier clase auxiliar que ayude al modelo, a la vista o al controlador. Esto ayuda a mantener al model, vista y controlador pequeños, enfocados y organizados.

Es importante recordar que una aplicación Rails es, vaya, una aplicación, no un set de páginas estáticas con un poco de código script en éste. Cuando un visitante inicia el ciclo de petición-respuesta, iniciado por escribir una URL en el navegador, el controlador se encarga de la petición, usualmente lee o guarda información de la base de datos, y después usa las vistas para regresar el HTML que se desplegará al usuario.

Además de los archivos en esos subdirectorios, hay un par de archivos que también crearemos o editaremos. Veremos esos pronto, pero la mayoría de nuestro trabajo ocurrirá dentro del subdirectorio app

Decidir si usar la base de datos por default que usa Rails o seleccionar la base de datos que queremos usar.

RMX: Ahora que hemos construido nuestra aplicación Rails, necesitamos saber qué base de datos utilizar. La convención de Rails es que el nombre de la base de datos que usaremos es el mismo de la aplicación en la que estamos trabajando, cookbook2 en este caso, unida al sufijo _development (desarrollo). Creo que eso funcionará para nosotros. Nombraremos nuestra base de datos cookbook2_development. También he dejado el password para nuestra base de datos de desarrollo vacío. Esa es la convención que Rails utiliza cuando genera el archivo de configuración para nuestra base de datos. Si hubiera configurado la base de datos con un password, le tendría que decir a Rails qué password utilizar para accederla. Para cambiar el nombre de nuestra base de datos o el password, hay que editar el archivo cookbook2/config/database.yml. Los cambios que debemos realizar son muy evidentes cuando miramos de cerca el archivo. Hasta tú, guiñendo a Pablo. Pero ya que estamos de acuerdo con las configuraciones de Rails, ni siquiera tenemos que cambiar esa configuración.

Si no existe, crear la base de datos que usaremos.

RMX: Ahora necesitamos crear la base de datos cookbook2_development No sé qué hayan oído de lo que hablo acerca de Rails, pero quiero asegurarme de que no estoy alentando a reemplazar nuestras herramientas existentes con Rails. El nicho de Rails es construir aplicaciones web. No le pertenece a tu tostadora hablarle a tu cafetera. Hay mejores herramientas para eso que Rails. De hecho...

Pablo: Tal vez podemos discutir eso después, RMX

RMX: Claro, tienes razón. Perdón por eso.

Nuestra aplicación necesita una base de datos. Una de las ventajas de Rails es que ofrece soporte para múltiples bases de datos, y cambiar entre ellas no requiere esfuerzo adicional que el de editar un archivo de configuración. Ya vimos lo fácil que es indicarle a Rails trabajar con MySQL, aunque igual de fácil es cambiar si así lo quisiéramos.

Primero creamos la base de datos. En la línea de comandos que tenemos abierta, entramos a la consola de MySQL como el usuario root

mysql -u root -p

Como no hemos definido un password para esta base de datos, tan sólo oprimiremos al preguntar nuestro password.

Después, creamos la base de datos:

create database cookbook2_development;

(NOTA: El punto y coma al final de la línea es requerido)

Si trabajamos en Windows, también necesitamos dar acceso a la base de datos a un usuario llamado ODBC, que es un usuario especial requerido por las librerías de Rails en Windows. De no hacerlo, obtendremos un error de MySQL cuando tratemos de acceder desde una línea de comandos. Para dar acceso, sólo introducimos:

grant all on cookbook2_development.* to 'ODBC'@'localhost';

(NOTA: Si no estás trabajando en un ambiente Windows, y en algunos casos incluso si lo estás, este acceso no es necesario. En general, permitir accesos ilimitados a tu base de datos a un usuario genérico no es algo que usualmente haces. Hemos incluido estas líneas para asegurarnos que no tendrás un error fácilmente evitable mientras sigas el tutorial)

Ahora tecleamos...

exit

para regresar a la línea de comandos del sistema operativo.

Con esto terminamos por ahora con la base de datos.

La base de datos

Decidir en qué característica trabajar.

RMX: Bien, jefe. En la pantalla que me mostraste dice que podemos crear, agregar, actualizar y borrar recetas. La nota del consultor dice que podemos hacer lo mismo con las categorías, y que a cada receta se le puede agregar una única categoría. Todo esto parce demasiado sencillo. ¿Dónde crees que debemos comenzar (Diciéndolo con un poco de saña. Es tan divertido incomodar al jefe)?

Jefe: Bueno, RMX (dice, con un tono de condescendencia), creo que debemos comenzar por poder crear una receta, ¿cierto? Después poder leerlas. Después editarlas, y después borrarlas. Después necesitamos hacer lo mismo con las categorías, y después las unimos. Finalmente, nos movemos a la verdadera programación del sistema. ¿No es así como funciona esto?

RMX: Sip, así es cómo hacemos estas cosas, jefe (¡Ajá! ;-) ) Una vez y otra vez. Y otra. Y otra más. Y ese es el punto de Rails. Siempre comenzamos haciendo las mismas cosas cuando creamos una aplicación web con base de datos. Por eso automatizamos esa parte y nos movemos al verdadero desarrollo. Rails asume que necesitamos de crear, leer, actualizar y borrar los datos que le digamos que usaremos. Una vez que tenemos las tablas de la base de datos con las que trabajaremos, Rails generará todo el código básico que necesitamos para hacerlo. Esto es parte de donde viene el aumento x 10 en nuestra productividad.

La aplicación es realmente muy sencilla para Rails. En efecto este es el punto fuerte de Rails, así que aprovecharemos.

Si no existen, crear las tablas que utilizará dicha característica

RMX: Es obvio que necesitaremos una tabla para recetas y otra para categorías. La relación entre éstas es de uno-a-muchos. Esto quiere decir que debemos incluir una llave foránea en la tabla de recipes.

Abriré mi editor favorito y escribiré una cuantas líneas de código SQL.


drop table if exists recipes;
drop table if exists categories;
create table categories (
    id                     int            not null auto_increment,
    name                   varchar(100)   not null default '',
    primary key(id)
) engine=InnoDB;

create table recipes (
    id                     int            not null auto_increment,
    category_id            int            not null,
    title                  varchar(100)   not null default '',
    description            varchar(255)   null,
    date                   date           null,
    instructions           text           null,
    constraint fk_recipes_categories foreign key (category_id) references categories(id),
    primary key(id)
) engine=InnoDB;

RMX: Hey Pablo, ¿recuerdas cuando dije que había un par de archivos fuera del directorio app que usaríamos? El script que contiene las tablas que usaremos es uno de ellos. Ahora, jefe, salvaré el archivo a ../cookbook2/db/create.sql, y estamos listos para crear las tablas.

En la ventana de comandos que mantengo abierta, me cambio al directorio cookbook2. Después introduzco

mysql cookbook2_development < db/create.sql

MySQL ejecuta el script y regresa a la línea de comandos sin decir nada. Eso quiere decir que todo salió bien. Nuestra base de datos contiene ahora dos tablas: recipes y categories.

Pablo: RMX, ese script parece que es específico a MySQL. Eso puede ser un problema para la gente de sistemas.

RMX: Lo sé. Otra desventaja de los scripts de SQL es que pierdes datos cuando decides agregar un campo a una tabla. La ventaja de los scripts es que son fáciles, en especial para quienes están acostumbrados a hacerlo. Por eso es que estoy usando uno aquí con el jefe.

Afortunadamente, Rails también nos brinda una herramienta llamada migraciones. Es un poco apresurado verlas ahora, pero las migraciones nos dan independencia de plataforma y un mecanismo que nos permite hacer cambios a nuestros modelos incrementalmente sin perder datos cada vez que hacemos un cambio. Tal vez después tengamos oportunidad de platicar sobre eso.

6. Generar un código de base para usar con las tablas

RMX: Ahora que tenemos las tablas que Rails utilizará, podemos pedirle que genere nuestra aplicación básica. En la jerga de Rails, a eso se le llama scaffolding. En la línea de comandos, asegurándonos de que estamos en el directorio cookbook2, introducimos

ruby script/generate scaffold recipe title:string description:string date:date description:text

Esto le dice a Rails que genere el scaffolding: el modelo básico, el controlador y los archivos correspondientes a las vistas que usará nuestra aplicación para la tabla de recetas. Puedes ver que Rails genera algunos archivos. En la línea de comandos que acabo de introducir, le dije a Rails acerca del modelo que me interesa: recipe. Rails creó tanto al modelo como al controlador. Para el modelo, nombró al archivo recipe.rb y lo colocó dentro del directorio recetas2/app/models. De la misma manera, nombró al archivo del controlador recetas_controller y lo colocó dentro del subdirectorio recetas2/app/controllers. Los parámetros que recibe el comando le indican al generador qué campos se deben de controlar por medio del scaffold, es decir, los campos que incluirán nuestras formas.

Creando la base de datos y el scaffolding

Ahora hago lo mismo para las categorías. De nuevo, en la línea de comandos, escribo:

ruby script/generate scaffold category name:string

Esto le dice a Rails que cree el modelo, controlador y vistas básicos, para la parte de nuestra aplicación que usará la tabla de Categories. Como antes, Rails nombrará al modelo /cookbok2/app/models/category.rb y al controlador /cookbook2/app/controllers/categories_controller.rb.

... y el scaffolding del otro modelo

RMX: Ok, jefe. Todo lo que he hecho hasta ahora ha sido muy rápido y sin complicaciones. Pero no es particularmente emocionante. Aquí es cuando la cosa cambia.

Pero, antes de que continuemos, miremos exactamente lo que hemos hecho. He introducido un total de ocho comandos: cinco comandos de MySQL y tres de Rails. He creado un script de SQL con 17 líneas. Eso no es lo que llamaría hacer código, pero lo que estás a punto de ver... ¡mejor sostén tu sombrero!

7. Mejorar

RMX: Voy a usar el servidor que viene integrado con Rails. Una vez dentro del directorio cookbook2, en la línea de comandos introducimos:

rails server start

Cuando Mongrel ha finalizado su inicialización, está listo para servir nuestra app.

¡Tenemos Mongrel corriendo!

RMX: ¿Estás listo?

Jefe: ¿Listo para qué? ¡Tan sólo me recordaste que aún no has escrito nada de código!

RMX: Eso es cierto, pero no quiere decir que no hayamos sido productivos. Ten, toma el teclado. Ahora abre un navegador y ve a la dirección http:://localhost:300/categories


Pablo: Veo que el servidor es Webrick, RMX. ¿Todas las aplicaciones en Rails deben usarlo?

RMX: No del todo. Webrick ha sido el servidor estándar incluido con Rails por ser ligero, y excelente para prototipar. A pesar de eso, no es una obligación usarlo. Hay otras buenas alternativas, como mongrel o passenger. Podemos ver eso después si te parece.


Nuestra aplicación funcionando

Ahora sigue el link

Crear nueva categoría

Introduce una categoría y haz click en el botón "Create"

¡Categoría creada!

(NOTA: El lector típico de O'Reilly - o de Rails.mx -, increíblemente astuto, probablemente notó que RMX no dijo tan sólo: "Introduce una receta y haz click en el botón de crear". ¿Porqué?, podrías preguntar. Porque aún no funcionará. Recuerden: aún no hemos escrito nada de código. No escribiremos tanto, pero necesitamos unas cuantas líneas para que todo funcione correctamente. No muchas. Sólo unas cuantas. Esto se verá en la segunda parte de este artículo.

Jefe: Ahora, RMX, esto está cool, qué digo cool -- es fantástico. ¿Qué tal las recetas?

RMX: Tan sólo apuntemos el navegador hacia http://localhost:3000/recipes

Listado de recetas

Hacemos click en el link

Nueva receta

RMX: ¿Cómo te quedó el ojo, jefe?. Tu sombrero debe de haber volado, ¡te dije que lo sujetaras!

Jefe: Eso es simplemente impresionante, RMX. Debo confesarte, cuando acordamos comer pizza, realmente no tenía fe en que fueras capaz de hacer la aplicación, de principio a final, antes de que acabara el almuerzo. Estoy comenzando a pensar que después de todo no me estabas "choreando".

RMX: ¡Y ni siquiera hemos escrito nada de código!. Probablemente estés ansioso por hacerlo, pero antes de eso, comamos algo de pizza. Porque, ya sabes, con la emoción de Rails hasta hemos dejado que se enfríe la pizza...

Comentarios »