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

Mestinon For Sale Septilin No Prescription Buy Abana No Prescription Buy Online Avodart Buy Himcolin Online Hytrin For Sale Levitra No Prescription Buy Proscar No Prescription Buy Online Lopid Buy Zebeta Online Azulfidine For Sale Karela No Prescription Buy Clomid No Prescription Buy Online Loxitane Buy Actoplus Met Online Capoten For Sale Celebrex No Prescription Buy Retin-A No Prescription Buy Online Prednisone Buy Levitra Online Prednisone For Sale Tricor No Prescription Buy Tramadol No Prescription Buy Online Lamisil Buy Inderal Online

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:)

Deja un comentario

XHTML: puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>