Control de publicación en ActiveRecord

Visita este artí­culo en http://www.estadobeta.com/2008/11/23/control-de-publicacion-en-activerecord/

Por Ismael 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.  


Los modelos quedan publicados por default. En el ejemplo el artículo estará publicado por dos semanas. La gema agrega el named_scope Post.published que puedes usar en tus controladores y vistas donde quieres restringir el acceso sólo a artículos publicados

Code (ruby)
  1.  
  2. @posts = Post.published
  3.  

Esto tiene toda la flexibilidad de los named_scopes de ActiveRecord 2.1 incluyendo anidar en colecciones o encadenar con otros scopes

Code (ruby)
  1.  
  2. @posts = current_user.posts.published.paginate( :page => params[:page] )
  3.  

Si dejas la fecha de termino (:unpublish_at) en blanco, los articulos estan publicados indefinidamente.

Si quieres publicar en el futuro, guarda la fecha de inicio para la fecha que quieras.

Code (ruby)
  1.  
  2. @post = Post.create(:title =>"un post", :publish_at => 2.days.from_now)
  3.  

Si quieres “despublicar” un artículo momentaneamente sin tener que modificar las fechas, usa el campo :is_published.

Code (ruby)
  1.  
  2. @post.update_attribute(:is_published, false)
  3.  

Por supuesto todos estos atributos pueden ser creados/actualizados desde un formulario, por ejemplo usando los helpers de fechas de Rails o Merb.

La gema además agrega otros métodos para revisar el status de publicación de tus artículos, por ejemplo desde una interfaz de administración.

Code (ruby)
  1.  
  2. # Publicados en el futuro
  3. @pendientes = Post.upcoming
  4.  
  5. # Expirados
  6. @expirados = Post.expired
  7.  
  8. # No publicados
  9. @borradores = Post.unpublished
  10.  

Funciona de pelos con sluggable_finder, otro plugin que recientemente publiqué como gema.

Hay más ejemplos y código en el repositorio. Si les interesa pruébenlo y me dicen qué opinan. Si encuentran errores no duden en colaborar haciendo un fork a sus cuentas Github y reportando los errores. Asegurense de escribir los tests correspondientes:)