Convención para extender ActiveRecord

Por Ismael en 26/11/2008 en Desarrollo, Ruby & Rails, artículos

No hay una sino muchísimas formas de extender ActiveRecord. Buceando entre los cientos de plugins y extensiones disponibles encuentro distintas estrategias para incluír módulos, sobreescribir métodos o configurar opciones.

Me encontré especialmente frustrado al buscar alguna forma más o menos estándar de definir macros o métodos de clase que definen nuevo comportamiento, algo común en los infinitos plugins de una sola línea como acts_as_tree, acts_as_versioned (y toda la serie “acts_as”) o mis propios ar_publish_control y sluggable_finder.

Code (ruby)
  1.  
  2. class Post < ActiveRecord::Base
  3.   acts_as_tree #
  4. end
  5.  

Lo siguiente es un boceto para una convención orientada a escribir extensiones de ActiveRecord en forma de gemas. Una gema de ejemplo, incluyendo tests, se encuentra aquí.

Control de publicación en ActiveRecord

Por Ismael en 23/11/2008 en Proyectos, Ruby & Rails, artículos

Gema ruby para agregar control de publicación a tus modelos ActiveRecord

ar_publish_control es una gema Ruby para añadir control de publicación a tus modelos ActiveRecord.

En muchos de los proyectos en que he trabajado, especialmente administradores de contenido, se necesita algún tipo de control sobre las fechas y status de publicación de información. Nada nuevo, pero los plugins y librerías que encontré no hacían exactamente lo que quería. Mi gema está basada en Acts as Publishable, un sencillo plugin para Rails al que agregué funcionalidad y actualicé para funcionar con las versiones más recientes de ActiveRecord.

Decidí reeditar el plugin como una gema porque eso me permite tener tests autónomos (en rspec) y también usar la funcionalidad con otros frameworks. En este momento lo uso para un proyecto Rails en el trabajo y para un proyecto peronal en Merb.

Como estamos acostumbrados con ActiveRecord, usar ar_publish_control en tus modelos no podría ser más sencillo:

Code (ruby)
  1.  
  2. class Post < ActiveRecord::Base
  3.     publish_control
  4. end
  5.  

Básicamente, eso agrega fecha de inicio y fin de publicación a tus modelos, por medio de una serie de named_scopes que permiten haces cosas como:

Code (ruby)
  1.  
  2. @post = Post.create(:unpublish_at => 2.weeks.from_now)
  3.  

Lee el resto de este artículo »

Patrones jQuery: toggleTarget

Por Ismael en 22/9/2008 en artículos, javascript, jquery

Hace un tiempo recopilo funciones y utilidades que, usando jQuery, me encuentro usando una y otra vez en distintos proyectos. Una de las ventajas de jQuery es la abundancia de plugins disponibles, pero normalmente éstos son más avanzados de lo que necesito y en algunos casos prefiero escribir estos “microplugines” que soluciones casos muy concretos y al mismo tiempo comunes.

El caso

Quieres uno o más links que despliegue un elemento escondido en la página, o lo esconda si el elemento está visible (por ejemplo un link “ver más”).
El efecto debe ser accesible: sin javascript, el browser debe simplemente mostrar el elemento normalmente y el link debe ser un “ancla” a éste. El caso es similar a un ejemplo publicado tiempo atrás para MooTools.

Code (javascript)
  1.  
  2. <a href="#contenido" class="js_collapse">Mostrar o esconder</a>
  3.  
  4. <div id="contenido">
  5. Mostrar o esconder este contenido al presionar el ancla de arriba.
  6. </div>
  7.  

El código

Code (javascript)
  1.  
  2. (function($){
  3.   $.fn.toggleTarget = function(){
  4.     $(this).click(function(){
  5.       var target = $($(this).attr(‘href’));
  6.       target.toggle(‘fast’);
  7.       return false;
  8.     });
  9.   }
  10. })(jQuery);
  11.  

Uso

Code (javascript)
  1.  
  2. $(function(){
  3.   $(‘a.js_collapse’).toggleTarget();
  4. });
  5.  

La mayoría de estas utilidades las tengo bajo control de versiones en mi Github. Sientanse libres de hacer un fork y contribuír.

Link: jQuery patterns en Gihub.

Destacados

Prototype: Ajax

10/10/2006

Construyendo aplicaciones Ajax con la librería Prototype.js

122 Comentarios »

IT Corporativo, Microsoft y el mito del soporte

24/9/2006

Sobre la cultura del miedo a las nuevas tecnologías en los departamentos de IT de las grandes empresas y la excesiva dependencia de Microsoft para el desarrollo Web.

12 Comentarios »

CSS: buenas prácticas

30/5/2006

Sumario de trucos y buenas prácticas para diseñar con CSS.

29 Comentarios »

Terra y los estándares: sintomas de una enfermedad

14/1/2006

Los casos de Las Amarillas y Terra muestran falta de propósito en el uso de estándares web.

22 Comentarios »

3 capas de presentación

25/11/2005

Introducción a la serie “3 Capas de Presentación” para la construcción de interfaces web accesibles.

17 Comentarios »

Artículos recientes

En qué he estado

31/8/2008

Resumen de mi actividad de desarrollo web en los últimos meses.

16 Comentarios »

MiniFlickr: una gema

14/5/2008

Sencilla gema Ruby para obtener fotos de Flickr.

3 Comentarios »

Tablas HTML Dinámicas

5/5/2008

Manipulando tablas HTML con Javascript y el DOM

10 Comentarios »

Incondicionalmente

18/3/2008

Evitando estructuras condicionales para lograr código más legible y estable. Ejemplos en Ruby.

5 Comentarios »

El “errno: 150″ de MySQL

16/3/2008

No fue hasta mucho tiempo después de conocer MySQL que conocí las tablas tipo InnoDb. Estas, a diferencia de su contraparte MyISAM, poseen varias cualidades que la hacen deseable. Por ejemplo: Integridad Referencial.
Lamentablemente InnoDb posee algunos peros. Uno de los más molestos es el “errn: 150″ que aparece al ejecutar alguna sql […]

11 Comentarios »

Notas

HashMapper

HashMapper es una gema Ruby que escribí para facilitar la transformación de estructuras de datos (hashes o diccionarios).

El uso más obvio es cuando quieres normalizar parametros provistos por terceros antes de ingresarlos a tu aplicación. Por ejemplo normalizar el objeto params en aplicaciones Rails o Merb antes de pasar los datos a tus modelos, un problema bastante común si me preguntan. Actualmente lo usamos en uno de los proyectos de New Bamboo.

Échale una mirada al README para más información. Muchas gracias a mi colega Mark Evans.

Link: HashMapper en GitHub.

3/2/2009 | ¿comentarios?  | link

Merb es Rails es Merb!

Acabo de leer el anuncio. Los equipos de Merb y Rails trabajarán juntos para sacar la versión 3 de Ruby on Rails, combinando lo mejor de ambos frameworks en uno sólo.

Primero pensé que era algún tipo de broma pero al parecer la cosa va en serio.

¿Qué significa esto? para empezar, Rails más gentíl con tu RAM, más modular y thread safe. Para continuar, Algunas joyas de Merb como procesos de fondo que no bloquean tus controladores o master processes para controlar fácilmente tus Mongrels. Para terminar, toda la elegancia sintáctica que amamos de Rails.

Qué buena forma de recibir el 2009.

Link Merb *is* Rails.

23/12/2008 | 1 Comentario  | link

Gitcasts

Leiste sobre Git y tal vez Github, pero tanta nueva tecnología te abruma y no te decides a dar el salto y aprender sobre este espectacular software de control de versiones que ya usan los equipos de Merb, Ruby on Rails y otros grandes proyectos.

No hay más excusas. Gitcasts es eso, un feed RSS de screencasts (tutoriales en video) que exploran el uso diario de Git desde lo básico hasta uno que otro truco que puedes sacar de bajo la manga cuando quieras sorprender a tus colegas y amigos geek.

Dale, agrégalo a tu iTunes y ponte a ver los videos. Tu jefe entenderá que es por tu desarrollo profesional.

Link: Gitcasts.

26/5/2008 | 1 Comentario  | link

GitHub

GitHub 2

GitHub se lanza oficalmente al público hoy.GitHub es un hosting para repositorios Git, la nueva revolución del Control de Versiones, donde puedes fácilmente mantener tus repositorios, ya sea creando uno nuevo o “clonando” uno existente, entre los cuales se encuentran Merb, Rails y un numero creciente de proyectos Ruby y de otro tipo.

En New Bamboo hemos estado usando el servicio beta desde hace tiempo - usamos Git internamente para administrar nuestro código- y en verdad la aplicación es una joya. No sólo hace fácil algo tan complejo como el control de versiones, sino que agrega herramientas tremendamente utiles como un mapa historico de cada proyecto.

Adios SVN.

¿Saber más? Git, GitHub.

11/4/2008 | 8 Comentarios  | link

Sluggable Finder rev. 20

… Y hay más mejoras para mi plugin sluggable_finder.

La versión 20 incluye un arreglo para cuando el plugin es usado en colleciones de ActiveRecord.

Code (ruby)
  1.  
  2. @user.friends.find ‘ismael’
  3.  

El ejemplo anterior debiera levantar una excepción ActiveRecord::RecordNotFound si “ismael” no es parte de la coleccón @user.friends. Esto debiera funcionar para colecciones :has_many y :has_many :though

Como siempre, le pido a los usuarios que reporten cualquier problema.

4/4/2008 | 5 Comentarios  | link
Ver más notas

Links