Mostrando las entradas con la etiqueta Rails. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Rails. Mostrar todas las entradas

jueves, noviembre 18, 2010

Wash, DRY and fold

DRY es una de las recomendaciones mas mencionadas en el desarrollo de software, DRY es el acronimo de "Don't Repeat Yourself" o "No te repitas" en español.

DRY lo que promueve es la no duplicidad de código fuente en nuestro software, ya que la duplicidad acarrea una serie de problemas de mantenimiento, inconsistencia en la funcionalidad, falta de claridad, etc.

Es por eso que en nuestros desarrollos debemos de buscar patrones de código que se repiten una y otra vez para tratar de extraerlos, abstraerlos y reutilizarlos.

El origen de este post es precisamente, que en un desarrollo en Ruby On Rails que estoy haciendo, encontre estos patrones repetitivos en mis controladores. La mayoría de ellos trabajan haciendo CRUD de manera muy tradicional, por lo tanto las acciones de: Index, Show, Edit, New, Create, Update y Destroy tienen código muy similar a excepción de las referencias al modelo sobre el cual actúan.

Buscando una solución para eliminar esto, me encontré con el proyecto de José Valim (@josevalim) Inherited Resources, el cual trata precisamente sobre como mantenerse DRY.
Algo importante es que Inherited Resources no cambia nuestra forma de trabajar al nombrar variables con nombres genéricos para que puedan ser usadas en nuestros controladores, el se encarga de nombrar las variables de acuerdo a la convención de Rails por lo tanto su uso es bastante transparente.

El post no se trata sobre Inherited Resources, por lo que aqui les dejo ligas a material de referencia para quien guste conocer mas:

¿Bueno entonces de que se trata el post? Es sobre DRY, pero mi implementación de DRY para un problema particular.

En el proyecto que estoy trabajando, tuve la necesidad de que la aplicación de Rails consumiera datos de un API de otra aplicación, la aplicación, de hecho son varias aplicaciones, que contiene lo datos no tiene API, por lo que con una aplicación de Sinatra, le cree un API Rest para que pueda ser consumida con la aplicación Rails - la aplicación de Rails y las aplicaciones sin API están en diferentes servidores/redes -. Esta API Rest puede ser consumida desde Rails a través del uso de ActiveResources, que aparentan ser modelos normales de Rails, pero que en realidad hacen llamados remotos a través de http para obtener sus datos.

En mi problema, tengo un controlador con diversas acciones, donde cada acción hace una llamada Rest a diferentes modelos y muestra los datos obtenidos, hay llamadas que traen una colección de objetos y otras que solamente traen un objeto en particular.

El patron que comencé a ver en las diversas llamadas para traer colecciones de datos fue:


así como la variación siguiente, también para traer colecciones de objetos:


La diferencia entre ellos es que en ocasiones se pasa el ID y en otras no, fuera de eso son muy similares.

Por otro lado, al traer un solo elemento el patrón era el siguiente:


Donde se pasa el ID en otro orden como parametro y la llamada ya no es al metodo all, es a find.

Este código se repetia una y otra ves en mi controlador donde solo cambiaba el nombre del Modelo, así como las variables @modelos y @modelo que es a donde se asignan los datos una vez que se obtienen.

Mi intención aquí es hacer que esto funcione DRY, y con la ayuda de un poco de metaprogramacion es fácil el lograrlo.

La idea es que pudiese hacer algo como:

fetch_resources! :modelo

o

fetch_resource! :modelo

Para obtener mis datos a través de Rest para el modelo adecuado y que se cargara la variable correspondiente con los datos correctos.



Así es como llegue al código que se muestra arriba. El método en singular trae un solo modelo a través de Rest y el metodo en plural trae una colección de modelos, opcionalmente ambos pueden aceptar un filtro en forma de Hash, y el modelo se indica a través de un símbolo.

El metodo fetch! es el que hace toda la magia, primero crea un Hash con el filtro default para todas las llamadas Rest, luego evalúa si a traves de fetch_resource! o fetch_resources! le estamos pasando filtros adicionales, si es así, los integra al Hash de filtro default.

En este punto es donde esta lo mas interesante, usamos en simbolo que se almacena en la variable resource para obtener la referencia a la clase del modelo sobre el cual nos interesa hacer la consulta, por ejemplo si nuestro símbolo es :cliente, asume que tenemos un modelo Cliente y sobre el queremos enviar nuestra solicitud Rest.

Acto seguido identificamos si tenemos un ID a traves del Hash params en el controlador, si es así, identificamos si debemos de llamar al metodo find o all y colocamos los parámetros de la forma correcta, mediante send hacemos el llamado de forma dinamica y el resultado lo guardamos en la variable values.

Finalmente fetch! asume que si tenemos una colección y nuestro símbolo es :cliente, esperamos tener una variable @clientes con los datos, en cambio si tenemos un solo modelo como respuesta y nuestro símbolo sigue siendo :cliente, asume que esperamos una variable @cliente con el dato.

De esta forma en nuestras vistas podemos hacer uso de @clientes o @cliente según corresponda.

Si bien no hubo un ahorro significativo en lineas de código, si hubo la eliminación de lineas de código repetidas y susceptibles a errores o cambios, las cuales fueron reemplazadas por otras instrucciones mas simples que manejan el mismo escenario para cualquiera de mis modelos.


miércoles, noviembre 17, 2010

Tercera reunión de Tijuana.rb

Tentativamente el miércoles 1 de Diciembre sera la tercera reunión de Tijuana.rb, una vez mas será en la oficinas de Ingenia Creative, ubicadas en:

Blvd. de las Americas
5636 Interior D.
Lomas de Agua Caliente
Tijuana, Baja California 22040 México

Para ver el mapa de lugar, lo pueden consultar aquí.

La reunion sera de 7pm a 9pm, aun no hay temas ni presentadores definidos, así que si te interesa participar no dudes en comentarlo, cualquier tema de Ruby/Rails/Sinatra, principiante o avanzado es bueno.

Te puedes apuntar aquí en los comentarios del post o en el google group de Tijuana.rb

Actualización!
Ya hay presentaciones para esta reunión
@obelich hablara de su experiencia con Rails desde el punto de vista de un PHPero.
@stanmx nos platicara como usar el polimorfismo en Rails para ser mas DRY.

Nos vemos en la reunión.


domingo, noviembre 07, 2010

Segunda Reunion de Tijuana.rb

Este proximo miércoles 10 de Noviembre sera la segunda reunión de Tijuana.rb, edición llamada "mas vale tarde que nunca", en esta ocasión será en la oficinas de Ingenia Creative, ubicadas en:

Blvd. de las Americas
5636 Interior D.
Lomas de Agua Caliente
Tijuana, Baja California 22040 Mexico

Para ver el mapa de lugar, lo pueden consultar aquí.

La reunion sera de 7pm a 9pm, los temas a presentar se actualizaran en las próximas horas.
Temas para hoy en la reunion:
- Antonio Antillon: "Boy meets Rails"
La experiencia personal de un programador novato, durante la creación de una app en Rails para solucionar el registro de asistentes a la Expo Industrial BajaMak.

- Fernando Castellanos: "Google Maps V3 con Rails3"
Como usar los mapas de Google API V3 de manera facil y sencilla con Rails3.


jueves, noviembre 04, 2010

Ruby on Rails este mes de Noviembre

Al parecer un mes mas activo en cuanto a mis actividades en Ruby y Rails este mes de Noviembre.

Primeramente Alt.NET Hispano me ha invitado este sábado 6 de Noviembre a dar una VAN sobre Rails, la dirección para conectarse aparecera ese mismo dia en el sitio o traves de la cuenta de twitter @altnethispano, la VAN sera a las 18:00 UTC/GMT.

El domingo 7 participare en el evento "Latam en Rails" de Rails.mx, con la platica "Uso de Steakrb para BDD", la platica en es linea y sera a las 5:30pm hora del centro de Mexico.

Finalmente el proximo sábado 13 de noviembre estaré en el evento "Software Freedom Day 2010" del grupo de usuarios linux de Tijuana, este evento sera en el Museo del Trompo y estaré a las 10:00am hora del pacifico platicando sobre Rails.


sábado, octubre 16, 2010

Ayuda fuera de linea para Rails 3.0 en OSX

Existe en linea una buena cantidad de recursos de ayuda para trabajar en Rails, uno de los primeros sitios a consultar es RailsGuide, otro sitio en linea importante es el que contiene la documentación del API de Rails o el sitio Rails API; finalmente la fuente de ayuda mas importante es el mismo código fuente de Rails.

Todas estas opciones son muy buenas para resolver dudas sobre el API, el detalle viene cuando por algún motivo no estamos en linea. Si al momento de instalar nuestra gemas instalamos también la ayuda en formato rdoc, entonces podemos consultar el API desde la linea de comando con ri.

Por ejemplo si buscamos ayuda sobre content_for, en la linea de comando podemos ejecutar:

$ ri content_for

Después de un momento ri nos indica que hay mas de un resultado, entonces elijo el que están dentro del namespace de Ruby que nos interesa y volvemos a ejecutar ri:

$ri ActionView::Helpers::CaptureHelper#content_for

En este caso el resultado que nos muestra ri es la ayuda sobre ese especifico método de Rails. Esta opción funciona en todas las plataformas donde podamos instalar Rails, pero si estamos en OSX, pues tenemos una opción gráfica para la ayuda en linea.

Esta opción consiste en usar la aplicación de diccionario de OSX, donde instalamos el diccionario con la ayuda de Rails, este lo podemos descargar de el vinculo publicado en este post, y para instalarlo solamente copiamos el diccionario a la carpeta ~/Library/Dictionaries.

Abrimos la aplicación de diccionario y ya podemos consultar el API de Rails fuera de linea.

Inclusive mejor aun, desde nuestro editor - en mi caso MacVIM, me posiciono sobre la instrucción de la que quiero consultar el API y presiono las teclas Command + Ctrl + D y me aparece una "burbuja" con la ayuda proveniente del API.


Ya sea en linea o fuera de linea, hay opciones muy convenientes para siempre poder consultar el API de Rails.


martes, octubre 05, 2010

Como iniciarse en Ruby/Rails

En varias ocasiones me han hecho esta pregunta y generalmente no tengo una respuesta sencilla, ya que no creo que exista una receta para lograr esto.

Creo que lo primero es obviamente tener interes por Ruby y/o Rails, un buen lugar para comenzar con Ruby es el sitio de Ruby Lang. Un libro muy bueno es Programming Ruby. Realmente no conozco muchos recursos en español sobre Ruby en particular. Otro libro interesante es Learn to Program donde enseña como programar desde el punto de vista de Ruby.

Una buena recomendación, antes de moverse a programar en Rails es aprender a programar con Sinatrarb, ya que que Sinatrarb a diferencia de Rails, no agrega tanta "magia" y hay que conocer mejor el lenguaje para hacer una aplicación con este DSL.

Sobre Rails igualmente no conozco mucho contenido en español sin embargo puedo recomendar seguir y estar pendiente de las siguientes comunidades y eventos:

Una buena opción también es buscar si seguir a los tweeteros sobre temas de Ruby/Rails es español.

En cuestión de libros el único que puedo recomendar es Agile Web Development with Rails, aunque hay muchos otros.

De los recursos de podcasts y video, gratuitos y de paga puedo recomendar:

  • Peepcode $$, tiene por ahí varios vídeos básicos para aprender Rails
  • Tekpub $$, hay 2 series de videos una sobre Rails y otra sobre Sinatra y Rack
  • Rails3 de Gregg Pollack, videos con lo nuevo sobre Rails3
  • Railscasts, los videos por excelencia sobre Rails
  • SDRuby, videos de las sesiones de la comunidad de Ruby en San Diego CA
  • Ruby5, el mejor podcast sobre Ruby
  • Confreaks, videos de diversas conferencias de Ruby y Rails

Por ultimo y porque aun hay tiempo, bueno no mucho, Magma Rails es la primera - creo - conferencia de Rails en México y al parecer van a tener varias sesiones interesantes.

Como dije al principio no hay una receta especifica, pero si hay muchos recursos en Internet sobre Ruby y Rails, aunque la mayoría en ingles.

NOTA: En los comentarios me han pasado algunas referencias en español para comenzar en Rails.
Antonio me hace referencia RailsTutorial, el cual es un buen libro en linea
Obelich recomienda "El maldito libro de los descarrilados" ademas de recomendar la comunidad GuateOnRails de Guatemala y su curso de Rails. Tambien recomienda ASCII Casts en Español y un tutorial de Ruby.

Por otro lado desde algunas semanas me ha estado rondando la inquietud de hacer un taller de Ruby y Rails de unas 3 o 4 sesiones donde podamos aprender y construir aplicaciones, pero de momento no se que tanto interés habría aquí en la ciudad.


martes, septiembre 28, 2010

Heroku y MongoHQ con Mongoid en Rails3

He tenido la necesidad de mostrarle en linea a un cliente un prototipo de una aplicación Rails3 que usa MongoDB como base de datos, para mi la opción por excelencia para estos prototipos es usar Heroku, un hosting de aplicaciones en la nube para Rails muy fácil de usar.

Lo interesante de Heroku es que tiene cuentas gratuitas - aunque con ciertas limitaciones -, que son perfectas para mi propósito. (En la primera reunión de @tijuanarb, @bitfon platico sobre Heroku).

Pero Heroku no tiene soporte directo para bases de datos MongoDB, aunque si ofrece un addon para integrarse con MongoHQ, servicio también en la nube para este tipo de base de datos, y al igual que Heroku, también tiene cuentas gratuitas, excelente también para prototipos. (También en la primera reunión de @tijuanarb, @fcastellanos hablo sobre MongoDB)

Hasta aqui todo bien, mi detalle vino al revisar la documentación de Heroku de como configurar la conexión a MongoHQ, ya que se requiere de una variable ambiente MONGOHQ_URL donde se coloca una URL que MongoHQ proporciona para cada base de datos, la forma de agregar esta variable en nuestra aplicación de Heroku es la siguiente:

$ heroku config:add MONGOHQ_URL="mongodb://mi-url-de-la-db-que-me-dio-mongohq"

Nota: a comentario de @fcastellanos, a la url de MongoHQ ha que agregarle el usuario y clave que tiene acceso a la base de datos, ejemplo:

$ heroku config:add MONGOHQ_URL="mongodb://[usuario]:[password]@[url_mongohq]"

Mi detalle viene a partir de que la documentación de Heroku no indica ningún paso adicional para configurar MongoID, la libreria de Ruby que mi aplicación usa para comunicarse con una base de datos MongoDB, sin embargo si hay pasos adicionales para otras librerías similares.

Así que asumí que todo estaba bien, me conecto a la aplicación y me indica un error, al revisar el log veo que no encuentra la base de datos, por lo tanto al parecer MongoID no estaba haciendo uso de la variable de ambiente MONGOHQ_URL.

Revisando el archivo config/mongoid.yml donde se configura la base de datos veo que espera obtener los valores de varias variables de ambiente:

host:

port:

username:

password:

database:

Así que lo que procedí a hacer es cargar esas variables al momento de iniciar mi aplicación para esto modifique el archivo config/applicacion.rb y justo a partir de la segunda linea y antes de los "require" agregue el siguiente código:

# MongoHQ Setup

require 'uri'

if ENV["MONGOHQ_URL"]

mongo_uri = URI.parse(ENV["MONGOHQ_URL"])

ENV["MONGOID_HOST"] = mongo_uri.host

ENV["MONGOID_PORT"] = mongo_uri.port.to_s

ENV["MONGOID_USERNAME"] = mongo_uri.user

ENV["MONGOID_PASSWORD"] = mongo_uri.password

ENV["MONGOID_DATABASE"] = mongo_uri.path.gsub("/", "")

end

Después de esto, volví a lanzar mi aplicación y ahí estaba finalmente funcionando, por fin Heroku y MongoHQ estaban trabajando juntos.


jueves, septiembre 23, 2010

Reunion del grupo tijuana.rb

El dia de ayer miércoles, se llevo a cabo la 1ra reunion de grupo de usuario de ruby/rails tijuana.rb, en la cual Sergio Lopez (@bitfon) habló sobre Heroku y el flujo de trabajo para publicar aplicaciones en ruby en la nube y Fernando Castellanos (@fcastellanos) sobre mongodb y como usarla en Rails.

El lugar fue la parte exterior del Starbucks Lucerna en zona rio, y tengo que admitirlo llego mucha mas gente de la esperada, en un punto éramos alrededor de 15 o poco mas, y aunque las condiciones del lugar no fueron las optimas - no nos alcanzo el espacio donde estábamos -, creo que estuvo bastante bien para la primera reunión. Así que para la siguiente reunión vamos a tratar de tener un lugar adecuado.

Ambas platicas interesantes y con muchas preguntas por parte de los asistentes.

En la reunion tambien nos acompañaron Jed Sundwall (@jedsundwall), Edward O'Connor (@hober) y Patrick Crowley (@mokolabs) del grupo de @SDRuby y SANDPYT - San Diego Phyton -. Y aunque solo uno de ellos hablaba español participaron de manera activa; y trajeron algunos regalos para rifar con los asistentes.

De lo interesante de que ellos nos acompañaran, es que tuve la oportunidad de platicar con Patrick, y salió la posibilidad de realizar eventos en conjunto, ya sea aqui en Tijuana o San Diego, lo cual es de lo mas interesante. De entrada ya veremos la posibilidad de realizar un "carpool" para asistir a la próxima reunión de @SDRuby.

Gracias a los que asistieron y esperamos verlos el siguiente mes, con mejores condiciones de espacio y gracias a @bitfon y @fcastellanos por su participación.








lunes, septiembre 20, 2010

La complejidad de Ruby On Rails

A raíz de mi post anterior y algunos comentarios expresados en él acerca de la complejidad para tener una aplicación de Ruby On Rails funcionando con MongoDB, he decidido escribir este post, el cual lo voy a tratar desde la vista de un ex(o casi)-desarrollador de .NET y aunque quizás algunos de mis comentarios parezcan un ataque a un .NET, no es esa mi intención, así que por favor tomenlos relajados. Ni tampoco es mi intención decir cual es mejor o cual es peor, ese es un ejercicio que cada quien forma personal debe de realizar

Comencé a desarrollar en .NET desde las versiones beta del mismo, ya hace mas de 10 años, e inclusive desarrolle para Web desde antes, ya sea con código escrito en C a modo de cgi-bin o Perl, al igual me toco desarrollar para Web en Visual Basic 4 - 6. En esos tiempos era realmente algo complejo hacer paginas dinámicas y era muy sencillo tomar decisiones incorrectas y hacer que el desarrollo se complicara enormemente.

Con la llegada de .NET Microsoft proponía otro paradigma un tanto diferente de como desarrollar a Web, proponía hacerlo tal y como se escribían aplicaciones de escritorio, solo haciendo "drag and drop", "right click", configurar aqui y alla y listo, tener aplicaciones sin - o casi sin - escribir una linea de código, digo cuantas veces no hemos visto a empleados de Microsoft haciendo este tipo de demos en eventos de la empresa.

Desde mi punto de vista - si desde mi punto de vista y experiencia - esto funcionada super bien para aplicaciones muy simples y predecibles, mi problema siempre venia cuando se quería hacer "algo mas" con la aplicación, la complejidad de desarrollo iba en aumento y en ocasiones se convertía en algo nada trivial. Durante ese tiempo también me toco hacer desarrollo con Java, varios frameworks para Web y Tomcat, y la experiencia no fue mejor.

Llego un punto en el cual casi casi decidí dejar de escribir aplicaciones para Web y únicamente escribir aplicaciones para escritorio, pero los clientes seguían solicitando aplicaciones Web, así que busque alternativas en .NET - PHP realmente nunca me gusto ni me gusta, quizás no tengo argumentos técnicos para decir porque, simplemente no me gusta -.

La alternativa que encontre fue MonoRail, comencé a ver los ejemplos y a entender sus dependencias, MonoRail es un framework para ASP.NET que trabaja con los patrones de MVC y ActiveRecord, inspirado por Action Pack. Al investigar que es Action Pack, descubrí Ruby On Rails, pero en ese momento le encontre un problema, tenia que aprender otro lenguaje de programación y tenia algunas semanas para entregar una aplicación Web para un cliente.

Así que me decidi por MonoRail, pero había algunos "detalles", tenia muchas dependencias, no tenia "Wizards" ni componentes o controles como se les llama en ASP.NET WebForms, en lo personal no lo vi como problema ya que en lo personal es raro que use los "Wizards" o que utilice controles de 3ros, así que para mi no había perdida ahí, aunque si me ha tocado conocer y dar cursos a desarrolladores de .NET que si no tiene un "Wizard" o no pueden poner su "Grid" súper "fancy" no son capaces de desarrollar una aplicación.

Por otro lado, si bien la configuración de un ambiente de trabajo con MonoRail requeria de un poco de trabajo y entendimiento por arriba de "Drag and Drop" y "Right click", no me pareció gran cosa y mas cuando es algo que solo haces una sola vez. MonoRail me permitió entregar varias aplicaciones de manera muy rápida, quede impresionado y eso me llevo a investigar sobre Ruby On Rails. Por cierto hace algunos días anunciaron, parte de "Roadmap" de MonoRail.

El motivo por el cual MonoRail me permitió entregar aplicaciones muy rápido fue porque no tuve que tomar decisiones, MonoRail lo hizo por mi, por ejemplo no tuve que decidir como organizar mi aplicación, no tuve que decidir como conectarme a la base de datos, todo lo decidió MonoRail, así solo tuve que enfocarme en la funcionalidad que era importante para mis clientes y ya. MonoRail al igual que Ruby on Rails es opinioted software.

Al llegar a Ruby on Rails, obviamente la primera barrera fue el lenguaje Ruby, pero es muy facil acostumbrarse a el, aunque todavia escribo código a la C#, pero creo que voy mejorando.

Para la gente acostumbrada a los IDEs hay una gran variedad de opciones a elegir, en lo personal no soy fan de las IDEs, prefiero ambientes mas ligeros y que me hagan usar la consola de comandos, por lo tanto en Windows se puede seguir esta guia y en Linux estas dos guias, puede parecer complicado, pero es algo que solo se tiene que hacer una vez, si se usa un IDE en cuestión de minutos se tiene un ambiente complete y configurado.

Es muy sencillo crear una nueva aplicación con Ruby On Rails (RoR) haciendo uso de las decisiones que el framework hace por nosotros, por ejemplo:

$ rails new mi_super_app

$ cd mi_super_app

$ rails generate scaffold client name:string, address:string

$ rails server

Dirigimos nuestro navegador a http://localhost:3000/clients y listo ya podemos comenzar a dar de alta y modificar clientes, simple, fácil y rápido.

Si bien esto funcionara tal y como esta en un gran numero de casos, la gente en RoR pensamos en la regla 80/20, hay momentos en que se tiene que hacer algo un poco diferente para configurar nuestra aplicación, donde podemos cambiar las decisiones que RoR hace por nosotros y adaptarlas al 100% de nuestras necesidades, como las modificaciones propuestas en mi post para usar MongoDB en lugar de una base de datos relacional.

Si bien la intención de mi post es servir como una guia o receta, paso a paso de como hacerlo, también podemos hacerlo sencillo con el uso de Templates - así como existen también templates en Visual Studio para crear aplicaciones con ciertas características y defaults -, en e siguiente video de Railscasts se explica el concepto. De hecho existe ya un template para pre-configurar una aplicación de RoR para usar MongoDB y Rspec, con el cual se puede omitir mi post y solo ejecutar:

$ rails new mi_super_app -JOT -m ~/path_a/mongodb_template/templater.rb

Ya viendolo así, ¿ya no se ve que sean muchos pasos no?

Sobre el tema de las dependencias, al igual que en cualquier otro framework o lenguaje podemos tener dependencias a librerías de terceros o podemos elegir no hacerlo. En el caso de Ruby y sus diferentes frameworks, hay librerías para casi todo lo que nos podamos imaginar, RubyGems es un buen lugar para descubrirlas y Bundler nos permite manejar esas dependencias de forma sencilla y a nivel aplicaciones, es decir podemos tener la misma dependencia pero hacia diferentes versiones de la librería sin conflictos, no hay "DLL Hell".

Para determinar como elegir que dependencias tener en nuestra aplicación, va en relación directa de nuestras necesidades, pero creo que puedo sumarizar algunos criterios:

  • Librerías que fueron extraídas del framework de RoR
  • Librerías mantenidas por miembros del equipo de desarrollo de RoR
  • Librerías que son tan viejas como el mismo framework de RoR y que evolucionan paralelamente
  • Librerías mantenidas por empresas de desarrollo en RoR
  • Librerías populares y que tengan pruebas

Con respecto al soporte de los librerías disponibles en Ruby, este varia, pero el común denominador es que son OSS y el código de casi todas esta disponible en Github. En experiencia personal no he tenido problemas con esto, ya que a través de los grupos, IRC, reportando bugs o correo directo he tenido solución cuando se me ha presentado algún problema, inclusive, he enviado parches que han sido aceptados y generalmente la corrección a mi problema puede llevar algunas horas en lugar de tener que esperar días si fuese un bug en una librería comercial.

De las librerías que he utilizado realmente no me ha tocado alguna que pierda el soporte, cuando el desarrollador principal se retira generalmente sale alguien a continuar trabajando en ella, lo que si me ha tocado experimentar es el reemplazo de librerías por otras mejores, por ejemplo, cuando entre a RoR restful_authentication era "la librería" para el manejo y autentificacion de usuarios, posteriormente authlogic la reemplazo y actualmente devise es la librería popular, no es que las otras tengan algo malo o funcionen mejor o peor, es solo la manera en como evolucionan las cosas.

Creo que personalmente lo que encontre en RoR es que no me tengo que pelear contra el framework para poder entregarle aplicaciones a mis clientes, todo lo contrario, me puedo olvidar un poco del framework y dedicarme a implementar la funcionalidad que le da valor a mi trabajo.

Y afortunadamente puedo decir que aquí en Tijuana no he sido el único que ha encontrado este valor, ya que desde que comencé a platicar sobre RoR varios amigos implementaron soluciones para sus empresas y clientes de estas que están en linea y en tiempo record, y traen todavía mas proyectos nuevos que están siendo desarrollados en RoR, de mi parte igualmente tengo un par de proyectos en RoR que pronto verán "la luz", proyectos para mis clientes. Al mismo tiempo se de empresas que están tomando cursos y evaluando RoR para el desarrollo de nuevas versiones de sus productos, todo esto solo en Tijuana.

Creo que después de esta explicación algunos estarán de acuerdo conmigo y otros no, a final de cuentas debemos de ser apasionados con el lenguaje/framework que elijamos para trabajar, porque para bien o para mal a estos le vamos a dedicar nuestro tiempo laboral; pero el ser apasionados también implica el ser críticos de lo que usamos y si es posible conocer y probar otras herramientas, aunque si trabajamos para una empresa "casada" con una compañía/tecnología va a ser un poco difícil cambiar su visión, ya que generalmente se usan x tecnología por cuestión política o de mercadotecnia o gusto personal de la persona que toma las decisiones.


sábado, septiembre 18, 2010

Aplicación de Rails 3 con MongoDB

En los últimos días he tenido que iniciar un par de proyectos en Ruby On Rails, donde la base de datos que se ha requerido es una base de datos no relacional, en este caso MongoDB.

La idea de este post es documentar la configuración de una nueva aplicación en Rails 3 para usar con MongoDB, donde vamos a desactivar ActiveRecord e instalar las siguientes herramientas:

  • Generadores Rails para Mongo
  • Rspec para pruebas
  • Factory Girl para fixtures
  • Haml como plantilla de vistas y jQuery.

Como paso inicial es necesario crear una nueva aplicación de Rails 3 - Se asume que ya se tiene instalado Rails 3 y MongoDB -, pero vamos a pasar las opciones -O para que no se creen archivos de ActiveRecord, -J para que no se instale la librería de javascript Prototype y -T para que no cree el fólder para Test::Unit

$ rails new mi_app -O -J -T

Después de creada la aplicación, seria buena idea inicializar un repositorio de Git.

Una vez creada nuestra aplicación hay que realizarle algunas adiciones nuestro archivo Gemfile para agregar las dependencias de nuestra aplicación:

  • mongoid y bson_ext => Mongoid es la librería que usaremos para conectarnos a la base de datos de MongoDB y bson_ext es una extensión en C para acelerar la serializacion de BSON
  • haml => Lenguaje de plantilla alternativa para vistas en Rails, desde mi punto de vista menos verbal y mas "developer friendly" que html y erb.

Dentro de un grupo llamado :development agregamos las siguientes gemas:

  • rails3-generators => varios generadores para Rails 3, lo que nos permite ejecutar rails generate
  • haml-rails => generadores de haml para Rails 3
  • jquery-rails => generadores de jquery para Rails 3

En el grupo :test agregamos:

  • rspec => framework para pruebas en Ruby
  • rspec-rails => utilerias para pruebas en RSpec para Rails
  • factory_girl_rails => utileria para la creación de modelos para pruebas
  • remarkable_mongoid => librería para pruebas de modelos de mongoid con RSpec

El archivo Gemfile debe de quedar como se muestra a continuación.



Para instalar las gemas solo ejecutamos

$ bundle install

Para conocer mas de las gemas instaladas aquí les dejo los vínculos a sus referencias

Una vez instaladas las gemas hay que realizar algunas configuraciones, lo primero es configurar mongoid para trabajar con Rails y desactivar ActiveRecord, para eso ejecutamos el comando:

$ rails generate mongoid:config

Este comando va crear el archivo config/mongoid.yml donde vamos a configurar el acceso a la base de datos de MongoDB, también va a modificar el archivo config/application.rb y va a eliminar la dependencia de ActiveRecord, la parte superior de config/application.rb deberá quedar algo similar a:

# require "active_record/railtie"

require "action_controller/railtie"

require "action_mailer/railtie"

require "active_resource/railtie"

#require "rails/test_unit/railtie"

Ya que estamos en el archivo config/application.rb vamos indicandole a Rails que en nuestra aplicación deseamos usar haml, rspec y factory_girl por omisión, para esto dentro de la declaración de la clase Application < Rails::Application, pero al final agregamos el siguiente código



A partir de este punto instalamos el soporte para jQuery y Rspec en nuestra aplicación de la siguiente forma:

$ rails generate jquery:install #--ui para activar jQuery UI

$ rails generate rspec:install

Como ultimo paso vamos configurar RSpec para que trabaje con factory_girl y remarkable, ademas de eliminar el soporte a ActiveRecord y hacer que RSpec elimine las colecciones creadas en MongoDB por nuestras pruebas antes de la ejecución de cada prueba, esto es necesario para asegurarnos que al correr cada prueba la base de datos este "limpia" y así no crear conflictos y/o dependencias en las pruebas.

Al inicio del archivo spec/spec_helper.rb hay que requerir:

require 'factory_girl'

require 'remarkable/mongoid'

Un poco mas abajo indicamos que cargue los archivos Factory de factory_girl

Dir[Rails.root.join("spec/factories/**/*.rb")].each {|f| require f}

Después eliminamos el soporte a ActiveRecord comentando las siguientes lineas:

config.fixture_path = "#{::Rails.root}/spec/fixtures"

config.use_transactional_fixtures = false

Y finalmente dentro y al final del bloque de configuración de RSpec indicamos que antes de cada prueba elimine las colecciones de MongoDB

config.before :each do

Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop)

end

El archivo spec/spec_helper.rb deberá quedar muy parecido a



Una vez en este punto ya podemos proceder a crear nuestra súper aplicación usando MongoDB como base de datos, si ejecutamos el generador para model, o controller o scaffold, Rails 3 generara modelos para MongoDB o vistas en haml y creara los archivos necesarios en spec para realizar pruebas con RSpec.


lunes, septiembre 13, 2010

Primera Reunion de tijuana.rb

Ven y asiste a la primera reunion del grupo de usuario Ruby/Rails de Tijuana, tijuana.rb, este proximo miércoles 22 de Septiembre en el Starbucks Lucerna de la Zona Río, a partir de las 7pm.

En esta primera reunión, Sergio Lopez (@bitfon) nos platicará sobre @heroku, un hosting para Ruby/Rails con cuentas gratuitas. Estamos a la espera de la confirmación de una plática más. Fernando Castellanos(@fcastellanos) ya se apuntó con una platica sobre como usar MongoDB con Rails.

Para los que me han preguntado sobre como iniciar con Ruby, le dejo esta liga a un post "larguísimo" que escribí con ejemplos y aunque es sobre IronRuby funciona igual con Ruby. Si alguien lo quiere ver en video aquí esta la sesión grabada en ALT.NET Hispano.

Para estar al pendiente de lo que sucede con tijuana.rb únete al Google Group o sigue a @tijuanarb en twitter.


miércoles, septiembre 01, 2010

Localización de fechas en Rails

Al estar trabajando en un sitio/aplicación para un cliente bajo el CMS RefineryCMS, cambie el idioma de CMS a español, pero las fecha seguían apareciendo en formato en Inglés, ej: September 01, en lugar de 01 de Septiembre.

Aun y cuando ya tenia instalado el archivo es-MX.yml en el directorio locale y Rails estaba localizando otros textos pero no las fechas. En el archivo yml encontramos la siguiente estructura:

date:

order: [:day, :month, :year]

abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]

abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]

day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]

month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]

formats:

short: "%d de %b"

default: "%d/%m/%Y"

long: "%A, %d de %B de %Y"

formal: "%d de %B"

time:

formats:

short: "%d de %b a las %H:%M hrs"

default: "%a, %d de %b de %Y a las %H:%M:%S %Z"

long: "%A, %d de %B de %Y a las %I:%M %p"

am: "am"

pm: "pm"

En donde en Date:Formats:Formal encontramos "%d de %B, con lo que esperaria formatos de fecha 01 de Septiembre.

Resulta que con:

t (:formal, :scope => [:date, :formats])

podemos leer el formato "%d de %B del archivo de localización, pero ahora el problema es ¿como le indicamos a la fecha que formato usar?, bueno para eso usamos I18n, donde pasamos la fecha a formatear y el formato de acuerdo al idioma de la aplicación:

I18n::localize(date, :format => t (:formal, :scope => [:date, :formats]))

Ahora el único problema es que este código es bastante largo para colocarlo dentro de una vista, por lo que podemos mandarlo a un método helper de la siguiente forma:

def localize_short_date(date)

I18n::localize(date, :format => t (:formal, :scope => [:date, :formats]))

end

Con esto en nuestra vista solo llamamos:

<%= localize_short_date Date.now %>

Y nos aseguramos que la fecha es desplegada en el formato definido y localizada al idioma de la aplicación Rails.


lunes, agosto 23, 2010

Presentaciones de Ruby on Rails

Este próximo sábado 28 de Agosto estaré participando en el evento en línea "Desarrollando en Ruby On Rails", durante todo el sábado habrán una serie de charlas que cubren diversos aspectos del desarrollo de Ruby On Rails.

En mi caso estaré participando con la plática "Vistas en Rails" en la cual platicaré sobre facilidades que nos proporcionar Ruby On Rails al desarrollar nuestras UI.

Para ver las platicas solo es necesario ingresar el sábado a tv.rails.mx, recuerden que el horario de las platicas es del centro de México (CDT -05).

Ademas, los chicos del Grupo de Usuarios Linux de Tijuana están organizando el "Día Mundial del Software Libre" para este 18 de Septiembre, donde tambien ya me invitaron a dar la plática de "Desarrollo Web a la Rails" - un no tengo el horario -.

Así que si les interesa Ruby On Rails, no lo piensen y acompañenme en ambos o alguno de los eventos. Adicionalmente y de manera no-oficial, los invito a la Comunidad Tijuana.rb, comunidad sobre Ruby y Ruby On Rails de Tijuana, aunque aun no tenemos sitio web, ni reuniones, ya hay actividad en el grupo de la comunidad en Google Groups, asi como en la cuenta de twitter @tijuanarb


lunes, mayo 24, 2010

RailsConf 2010

Gracias a EngineYard que me regalo un pase a RailsConf 2010, estaré en Baltimore de 7 al 10 de Junio en el evento de eventos de Rails.

Inicialmente no lo tenia planeado, ya que hoy - 24 de mayo - recibí la invitación, me entero que la disponibilidad de hotel esta medio "presionada", es por eso que a través de este post, hago un llamado/invitación a personas que piensen asistir al RailsConf y que les gustaría compartir los gastos de hotel, se comuniquen conmigo para ponernos de acuerdo.

Me encuentran en twitter como mario_chavez y a través de mi correo de google mario.chavez


martes, mayo 11, 2010

Plática "Desarrollo Web con Ruby On Rails" en el CITEDI

Me invitaron del CITEDI IPN en la ciudad de Tijuana a participar en los Seminarios Académicos, los cuales son sesiones gratuitas y abiertas al público.

Mi plática se llama "Desarrollo Web con Ruby On Rails" y se llevará a cabo el próximo 14 de Mayo a las 12pm.

Ahí los espero a quienes tengan la oportunidad de darse la vuelta.



jueves, marzo 18, 2010

VIdeo de IronRuby en ALT.NET Hispano

Hace ya algunas semanas previas había publicado el código fuente de Ruby que utilice en los webcasts en los cuales participe a finales de enero, hace unos días me avisaron de ALT.NET Hispano que ya estaba listo y disponible el video que se grabo sobre mi sesión.

Como muchos de ustedes ya están enterados, el próximo sábado 20 de Marzo se llevara acabo un curso de Ruby on Rails aquí en Tijuana - para información de como asistir ver este post -, si bien el video habla sobre IronRuby, los conceptos ahí expresados aplican para Ruby a excepción la interoperabilidad con .NET, por lo tanto es muy recomendable para quienes tengan la intención de asistir al curso.

Por otro lado la comunidad de ALT.NET Hispano es una comunidad de desarrolladores de habla español que cada semana presentan lo se conoce como "desconferencias" -VAN -, donde se abordan temas principalmente de como mejorar nuestras técnicas y conocimientos de desarrollo en .NET.

Para participar con la comunidad de ALT.NET Hispano, podemos estar al pendiente de las próximas VANs o ver los vídeos de las VANs pasadas, o bien unirse al grupo de discusión.


miércoles, marzo 03, 2010

Curso de Ruby on Rails en Tijuana

[Actualización, 10 de Marzo] El curso si se va a llevar a cabo el día 20 de Marzo en el Cesun Universidad, Campus Morelos, de 9am a 6pm en Av. Cucapah *Sur # 20100* Fracc. El Lago.

Los interesados en asistir por favor pongan su comentario en el post de @stanmx sobre el curso, ya que a esas personas Stan les hará llegar la información de pago del curso, recuerden que ese dinero es para la compra de comida y bebidas para el curso, por lo tanto es importante que quienes deseen ir paguen cuanto antes para comprar las cosas con anticipación, cualquier duda sobre el pago Stan les puede ayudar.

Adicionalmente la gente de TekPub fue amable de regalarnos una subscripción a la serie de video de Ruby On Rails, la cual cuenta con 10 videos de 1 hora aproximadamente, cubriendo diferentes aspectos de RoR.
La subscripción se le regalara, en una mecánica por definir, a alguno de los asistentes de curso.

[Actualización, 8 Marzo] Es muy probable que el curso se lleve a cabo el día 20 de Marzo en el Cesun Universidad, Campus Morelos. En cuanto este confirmado se les hará saber.

Después de un par de meses de que @stanmx me estuviese dando lata comentara sobre su interés de un curso de Ruby On Rails, decidimos hacer el ejercicio de ver si había interés entre los desarrolladores de la ciudad, y el ejercicio fue bueno, actualmente hay alrededor de 12 personas que levantaron la mano.

Entrando en detalles del curso, actualmente estamos viendo quien nos puede facilitar un espacio para al menos unas 15 personas, de preferencia que tenga acceso a Internet y que podamos hacer uso de un proyector, obviamente también buscamos un lugar donde nos puedan abrir un sábado y estar ahí entre 10 y 12 horas.

El curso no es gratuito, pero tampoco es lucrativo, se pide una cooperación de $250.00 pesos, lo que incluye el curso y bebidas/alimentos/botanas durante la realización del mismo.

Pre-requisitos para el curso
Contestando a preguntas directas que me han realizado, sobre que se necesita a para poder atender el curso, aquí les dejo la siguiente información.

  • Llevar su propia computadora, de preferencia laptop
  • Conocer por lo menos lo básico de algún lenguaje de programación
  • Preinstalar Ruby on Rails - esto para evitar perder tiempo con las instalaciones y entrar de lleno al curso desde el primer minuto -
  • Sentirse cómodo utilizando la consola de comandos :)

Observaciones
Ruby On Rails puede hacer uso de diversos motores de base de datos, pero por cuestiones de simplicidad vamos a hacer uso del motor de SQLite, aunque si se va a explicar como, por ejemplo, cambiar la configuración para conectarse a un MySQL.

La version de Ruby on Rails sobre la que se va a trabajar es la 2.3.5, aunque la version 3.0 Beta 1 esta disponible, vamos a irnos por la ruta de la version estable.

Si desean instalar algún administrador gráfico para SQLite y tienen instalado Firefox, pueden instalarle el addon SQLite Manager.

¿Como instalar Ruby On Rails en mi equipo?
Dependiendo del OS de nuestra laptop es como vamos a realizar la instalación, por la lista de amigos que levantaron la mano al curso puedo darme cuenta que vamos a tener OSX, Linux y Windows, así que aquí va las guías para cada OS.

RoR en Windows
Hace algunos meses escribí un post que detalla la instalación de RoR en Windows, utilizando cygwin y un editor llamado e-TextEditor. El e-TextEditor no es gratuito tiene un costo como de 40 USD y cuenta con versión de evaluación.

Otra opción de instalación es utilizar algún IDE de RoR, las posibles IDEs las menciono mas abajo en el post ya que estas son comunes sin importar el SO.

RoR en Linux
Esta guía en español y para Ubuntu es muy fácil y directa, pero fácilmente se puede adaptar para cualquier distro de Linux.

Si se sigue esta guía, es recomendable configurar gEdit para RoR, lo cual nos da un buen IDE para trabajar en Linux.

Otra opción de instalación es utilizar algún IDE de RoR, las posibles IDEs las menciono mas abajo en el post ya que estas son comunes sin importar el SO.

RoR en OSX
En OSX es necesario insertar el disco de instalación de OSX e instalar las herramientas de desarrollo.

Como IDE es posible usar TextMate, aunque no es gratuito, cuentan con versión de evaluación.

Otra opción de instalación es utilizar algún IDE de RoR, las posibles IDEs las menciono mas abajo en el post ya que estas son comunes sin importar el SO.

IDEs para RoR
Para quienes se sientan mas a gusto con un IDE completo hay 3 posibles opciones de las cuales solamente una no es gratuita, pero cuenta con versión de evaluación.

Para lo que tengan duda sobre si instalar una IDE o no, en el curso no nos vamos a enfocar a ningún IDE en particular, todos los comandos los vamos a ejecutar desde la consola, la IDE nos va a servir únicamente como un editor de texto.

El curso
El temario tentativo para el curso es el siguiente:

  1. Introducción al lenguaje Ruby
  2. Introducción a Ruby On Rails
  3. Conocer una aplicación de Rails, a través de los bloques ActiveRecord, ActionController y ActionView
  4. El Patron MVC en Rails
  5. Básico del patron ActiveRecord - CRUD -
  6. Básico de controladores: acciones, filtros, parámetros, sesiones y mensajes flash
  7. Básico de vistas: plantillas ERB, layouts, parciales y helpers
  8. Mas de ActiveRecord: Validaciones, asociaciones, agregaciones y find_by_*
  9. Rutas en Rails
  10. Pruebas con RSpec
  11. Depuración, logging y uso de la consola
  12. AJAX en rails

Fecha y lugar

De momento de desconoce, espero que se pueda confirmar en los próximos días, la fecha depende en gran medida de la disponibilidad del espacio que nos faciliten, así que estén pendientes a este blog y a

twitter

.


miércoles, enero 06, 2010

Instalando Rails3 edge

Si tienen curiosidad de probar la próxima version de Rails, es muy sencillo instalarla en conjunto con la versión de Rails 2.x.

Aunque se supone que todavia no esta lista para produccion, ya por ejemplo 37Signals anunció que esta iniciando un nuevo proyecto con Rails3, además de que la versión beta se espera para finales de Enero.

Esta guia de instalación esta basada en el post "Rails 3" de Yehuda Katz, con algunas pequeñas modificaciones.

Primer paso. Instalar Bundler
Bundler es una gema de Ruby que nos permite crear un manifiesto de las gemas requeridas por nuestra aplicación, Bundler se encarga de leer ese manifiesto e instalar las gemas especificadas así como sus dependencias como parte de nuestra aplicación.

Este manifiesto se declara en un archivo Gemfile localizado en el directorio de nuestra aplicación.

$ sudo gem install bundler

Segundo paso. Clonar Rails3 desde el repositorio de Github
Ahora hay que descargar el código fuente de Rails3, para esto clonamos el reporsitorio de GitHub en algun lugar de nuestro disco duro.

$ git clone git://github.com/rails/rails.git

Tercer paso. Creamos una nueva aplicacion Rails3
<ruta_rails> apunta la directorio donde clonamos Rails3, lo de esta despues de rails/... es parte de las estructura clonada del repositorio y next_youtube es el nombre de nuestra aplicación Rails.

$ ruby <ruta_rails>/rails/railties/bin/rails next_youtube
$ cd next_youtube

Cuarto paso. Modifcar el archivo Gemfile
Para poder configurar las dependencias de nuestra nuestra aplicación, así como indicarle que es una aplicación Rails3, hay que hacerle unos ajustes a Gemfile.
<ruta_rails> apunta la directorio donde clonamos Rails3

# En la parte superior del archivo hay que agregar
rails_source_path = "<ruta_rails>/rails"directory
"#{rails_source_path}", :glob => "{*/,}*.gemspec"git "
git://github.com/rails/arel.git"
git "git://github.com/rails/rack.git"

gem "rails", "3.0.pre", :path => "#{rails_source_path}"
%w(activesupport activemodel actionpack actionmailer activerecord activeresource).each do |lib| gem lib, '3.0.pre', :path => "#{rails_source_path}#{lib}"
end


Quinto paso. Ejecutar Bundler para que instale las dependencias
Una vez que modificamos Gemfile, solo resta ejecutar Bundler para que instale las dependencias de nuestra aplicación.

$ gem bundle

Finalización.
Ahora ya podemos ejecutar script/server y ver como se "levanta" nuestra aplicación ejecutandose en Rails3. A partir de aquí ya podemos proceder a construirla.

Espero poder publicar algunos post de recopilaciones de nuevas características de Rails3 en las próximas semanas.


lunes, febrero 23, 2009

helper_method en Rails

Trabajando en una aplicación en Rails, me sugió la necesidad de hacer que un método que existe en la clase ApplicationController, estuviera disponible tambien para el ActionPack.

Lo primero que se me ocurrió fue duplicar el método en el helper de la vista donde lo requiero, pero eso no me pareció muy DRY (Don´t Repet Yourself); una búsqueda rápida en Google me dió la respuesta: helper_method

Con helper_method podemos declarar un método en nuestra ApplicationController, por ejemplo, y hacerlos disponible a nuestros controladores, pero al declarar nuestro método con helper_method, tambien lo hacemos disponible para nuestras vistas.

helper_method :hola_mundo

def hola_mundo
....
end

miércoles, febrero 11, 2009

ASP.NET MVC != Ruby On Rails

ASP.NET MVC desde que llego a los portales de noticias y se empezaron a publicar blogs sobre él, creo que ha estado bajo fuego enemigo como fuego amigo.

Y una buena parte de ese fuego, viene desde el "bando" de los programadores de WebForms, que no se hacen a la idea de desarrollar aplicaciones Web en esta herramienta tan "minimalista" y que no cuenta con ningún control UI que puedan "arrastrar y soltar" para componer su pagina, forzandolos a programar HTML.

Otra parte del fuego, viene de la misma gente .NET, que esperaban que ASP.NET MVC se parezca mas a Ruby On Rails y que están un tanto en desacuerdo con las decisiones técnicas que realizadas sobre el Framework.

Y por ultimo esta la gente que escucha el acrónimo MVC y espera que ASP.NET MVC sea un clon exacto de Ruby On Rails, y que al ver que no es así, simplemente desestima el Framework.

Desde mi punto de vista, ASP.NET MVC no debería de tener ningún compromiso de parecerse a Ruby On Rails, creo que debe de crecer por su cuenta, tomando las fortalezas de .NET así como sus debilidades también.

Pero volviendo al titulo de este post, ASP.NET MVC != Ruby On Rails y no se debe de esperar que lo sea por las siguientes razones:

Ruby On Rails es un framework super integrado desde la presentación Web hasta el acceso a la base de datos, esto nos ayuda a no preocuparnos sobre la "plomería" de nuestro proyecto y simplemente enfocarnos a lo importante, implementar la funcionalidad de negocio de nuestra aplicación.

Por su parte ASP.NET MVC es únicamente un Framework para desarrollar aplicaciones Web con el patrón MVC, pero no ofrece una guía sobre el acceso a base de datos, validación, ni ninguna otra cuestión de infraestructura. Aunque esto no es malo del todo; pero hay señales encontradas por parte del mundo .NET en este sentido, por ejemplo Microsoft empuja el uso de Entity Framework como capa de persistencia a datos, gente de la comunidad y empleados de Microsoft realizan sus demos con Linq2SQL y la gente mas independiente de Microsoft empuja NHibernate.

Esta situación donde no hay quien de una pauta, causa confusión en la gente que quiere aprender a desarrollar con ASP.NET MVC o los que vienen de frameworks como Ruby On Rails, que esperan llegar y desarrollar sin preocuparse de esas cuestiones, y que al final de cuentas se van decepcionados porque ASP.NET MVC no llena sus expectativas.

Hasta ahorita las únicas guías serias y con fundamento que he visto es la que promociona Headspring con su Arquitectura de la Cebolla y los proyectos CodeCampServer y MVCContrib, y la guía de SharpArchitecture, que de alguna manera es muy parecida a la Arquitectura de la Cebolla. Por lo menos ambas ayudan a olvidarse de los detalles de implementación y dedicarse a crear la funcionalidad de la aplicación.

Si a final de cuentas lo que buscamos son comparaciones, creo de ASP.NET MVC se parece mas al framework de Ruby Merb, el cual, al igual ASP.NET MVC es agnóstico a su capa de persistencia, presentación, etc.; tal y cual es el estado actual de ASP.NET MVC. Ambos frameworks tienen puntos extensibles que nos permiten reemplazar la funcionalidad original por nuestra la funcionalidad preferida.

Por lo tanto y para finalizar, quiero remarcarlo una vez mas, ASP.NET MVC != Ruby On Rails