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ículosActs 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.

Una vez instalado, el uso de la extensión en los modelos es sencillo:
-
class ContactForm < ActiveRecord::Base
-
acts_as_contactable
-
end
Esto agrega una declaración has_many :contact_fields al modelo, y una serie de métodos para manejar los campos de contacto.
-
contact = ContactForm.find( :first )
-
contact.contact_fields = [
-
{:name=>"Nombre", :field_type => :text, :required => true},
-
{:name=>"Email", :field_type => :email, :required => false}
-
]
-
contact.save
-
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.
-
contact.recipients = [
-
{:name => "Juan Pérez", :email => "juan@perez.com"},
-
{:name => "Juana Pérez", :email => "juana@perez.com"}
-
]
-
contact.save
-
contact.recipients #
-
contact.parsed_recipients # => [
-
{:name => "Juan Pérez", :email => "juan@perez.com"},
-
{:name => "Juana Pérez", :email => "juana@perez.com"}
-
]

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.
-
script/plugin install http://code.estadobeta.com/plugins/acts_as_contactable
-
script/generate acts_as_contactable_migration
-
rake db:migrate
En el archivo README hay más información y ejemplos de uso. Si lo prueban, díganme qué piensan!
- Servicios:
- Comentarios RSS
- Menear!
- Del.icio.us

7/10/2007 at 11:35 am
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.
7/10/2007 at 12:11 pm
Una cosa mas, yo le pondria al plugin acts_as_fieldable
7/10/2007 at 12:15 pm
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.7/10/2007 at 1:49 pm
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.)
7/10/2007 at 5:27 pm
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_contactablea 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 Product7/12/2007 at 8:58 pm
Sistema de formularios?
Me gusta, hace tiempo que estoy tratando de hacer lo mismo y que funcione bien, eso si en PHP.
8/17/2007 at 10:32 pm
[…] Sluggable_finder, el segundo plugin oficial de este servidor, es posiblemente más útil que el primero. […]