Un plugin: acts_as_contactable

Visita este artí­culo en http://www.estadobeta.com/2007/07/10/un-plugin-acts_as_contactable/

Por Ismael en Desarrollo, Proyectos, Ruby & Rails, artículos

Acts as Contactable es un plugin para Rails bastante sencillo que extraje del desarrollo de una de las aplicaciones Aardvark. Aunque hay mucho que mejorar (especialmente el nombre, que no me convence), me atrevo a publicarlo para que los “railseros” de la Venerable Audiencia lo destrocen y/o extiendan.

En Aardvark lo estoy usando para ciertos modelos que necesitan tener campos de contacto configurable. El primer caso es un modelo ContactForm donde el administrador debe poder crear o eliminar campos de formulario a gusto.

acts_as_contactable 1

Una vez instalado, el uso de la extensión en los modelos es sencillo:

Code (ruby)
  1. class ContactForm < ActiveRecord::Base
  2.   acts_as_contactable
  3. end

Esto agrega una declaración has_many :contact_fields al modelo, y una serie de métodos para manejar los campos de contacto.

Code (ruby)
  1. contact = ContactForm.find( :first )
  2. contact.contact_fields = [
  3.   {:name=>"Nombre", :field_type => :text, :required => true},
  4.   {:name=>"Email", :field_type => :email, :required => false}
  5. ]
  6. contact.save
  7. contact.contact_fields.size # => 2

El atributo :field_type se puede usar para validar los campos una vez llenos o para los distintos inputs HTML (se incluye un helper para esto último).

En los templates públicos cada modelo puede mostrar los campos asociados a cada modelo de la forma que se prefiera.

El plugin también usa, opcionalmente un campo “recipients” en el modelo afectado, donde se guarda uno o más destinatarios de correo en el formato Juan Pérez <juan@perez.com>, Juana Pérez <juana@perez.com>. Sin embargo, existe la posibilidad de acceder a cada uno de estos destinatarios como miembros de una colección.

Code (ruby)
  1. contact.recipients = [
  2.         {:name => "Juan Pérez", :email => "juan@perez.com"},
  3.         {:name => "Juana Pérez", :email => "juana@perez.com"}
  4. ]
  5. contact.save
  6. contact.recipients #
  7. contact.parsed_recipients # =>  [
  8.         {:name => "Juan Pérez", :email => "juan@perez.com"},
  9.         {:name => "Juana Pérez", :email => "juana@perez.com"}
  10. ]

acts_as_contactable 2
El plugin no envía los emails. Para eso se usa ActionMailer de la manera tradicional. En el estado actual el plugin incorpora un hook para validar los campos según su atributo :field_type y otra serie de propiedades, pero la validación no está implementada (en nuestra aplicación es otro módulo el que se encarga de eso). Pronto espero agregar validadores (o usar las validaciones de ActiveRecord, que sería lo ideal) y subir otras mejoras. Si hay tiempo también ampliaré la documentación, con ejemplos. Por ahora, lo instalan desde el repositorio y corren las migraciones necesarias.

Code (ruby)
  1. script/plugin install http://code.estadobeta.com/plugins/acts_as_contactable
  2. script/generate acts_as_contactable_migration
  3. rake db:migrate

En el archivo README hay más información y ejemplos de uso. Si lo prueban, díganme qué piensan!

7 comentarios para “Un plugin: acts_as_contactable”

  1. GravatarNico Orellana Dice:

    Wuooooo, notable Isamel. Plugins made in Chile. Se ve bastante interesante, no me había visto en ese problema, pero de seguro si lo tengo, me acordare.

    Saludos.

  2. GravatarNico Orellana Dice:

    Una cosa mas, yo le pondria al plugin acts_as_fieldable :)

  3. GravatarIsmael Dice:

    Si, o simplemente has_contact_fields, porque eso es lo que hace. A ver si el fin de semana lo modifico. Lo de “acts_as…” debiera reservarse para extensiones que modiciquen el comportamiento mismo de ActiveRecord, no que simplemente le agreguen campos relacionados.

  4. GravatarNico Orellana Dice:

    Tienes razón sería mas claro.

    Pero por ejemplo, al buscarle aplicación al plugin en realidad así tal cual no lo implementaría A NO SER que tuviese que usar formularios de contacto.

    Pero perfectamente podrías crear un plugin mas “general” que permita mediante una interfaz simple agregar fields al modelo que el usuario quiera.

    En este momento se me ocurre agregar fields a un modelo de productos. Por ejemplo, agregar “persona de contacto para esa linea” con un user_id y asignándole la persona a un producto X. (No se si me explico).

    Creo que un plugin que permita “fácilmente” eso, nos la vida mas simple a muchos. (Ok, vida es exagerado… nuestro trabajo.)

  5. GravatarIsmael Dice:

    De hecho para eso hice el plugin: tengo un modelo ContactForm y otro Product, y los dos necesitan campos configurables de contacto (los productos, para poder cotizarlos). La idea es que basta con ponerle acts_as_contactable a cualquier modelo y listo.
    Sobre extender el plugin para que incluya los templates para agregar formularios, creo que es mejor incluír un tutorial en la documentación, aunque tb se me ocurre hacer un generador de “scaffold” que cree esos templates, onda script/generate scaffold_contactable Product

  6. GravatarRodrigo Dice:

    Sistema de formularios?
    Me gusta, hace tiempo que estoy tratando de hacer lo mismo y que funcione bien, eso si en PHP.

  7. GravatarEstadoBeta » Archivo » Plugin Rails: sluggable_finder Dice:

    […] Sluggable_finder, el segundo plugin oficial de este servidor, es posiblemente más útil que el primero. […]

Deja un comentario

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