Esta joya se creó sobre ActiveModel
para mostrar cómo puede incorporar validaciones, nombres e i18n
desde Rails a sus modelos sin la necesidad de implementarlo todo usted mismo.
Este README se refiere a la gema MailForm que se utilizará en Rails 5+. Para obtener instrucciones sobre cómo utilizar MailForm en versiones anteriores de Rails, consulte las ramas disponibles.
MailForm le permite enviar un correo electrónico directamente desde un formulario. Por ejemplo, si desea crear un formulario de contacto, solo necesitará las siguientes líneas (incluido el correo electrónico):
class ContactForm < MailForm :: Base
attribute :name , validate : true
attribute :email , validate : / A [^@ s ]+@[^@ s ]+ z /i
attribute :file , attachment : true
attribute :message
attribute :nickname , captcha : true
# Declare the e-mail headers. It accepts anything the mail method
# in ActionMailer accepts.
def headers
{
subject : "My Contact Form" ,
to : "[email protected]" ,
from : %(" #{ name } " < #{ email } >)
}
end
end
Luego inicias una consola con rails console
y escribes:
>> c = ContactForm . new ( name : 'José' , email : '[email protected]' , message : 'Cool!' )
>> c . deliver
Revise su bandeja de entrada y el correo electrónico estará allí, con los campos de enviado (suponiendo que haya configurado correctamente su método de entrega de correo).
Cuando heredas de MailForm::Base
, extrae un conjunto de elementos de ActiveModel
, como ActiveModel::Validation
, ActiveModel::Translation
y ActiveModel::Naming
.
Esto trae I18n
, mensajes de error, validaciones y manejo de atributos como en ActiveRecord
a MailForm , por lo que MailForm se puede usar en sus controladores y creadores de formularios sin ajustes adicionales. Esto también significa que en lugar de lo siguiente:
attribute :email , validate : / A [^@ s ]+@[^@ s ]+ z /i
De hecho, podrías hacer esto:
attribute :email
validates_format_of :email , with : / A [^@ s ]+@[^@ s ]+ z /i
Elige el que más te guste. Para obtener más información sobre la API, continúe leyendo a continuación.
MailForm también funciona bien con ORM. Sólo necesitas incluir MailForm::Delivery
en tu modelo y declarar qué atributos deben enviarse:
class User < ActiveRecord :: Base
include MailForm :: Delivery
append :remote_ip , :user_agent , :session
attributes :name , :email , :created_at
def headers
{
to : "[email protected]" ,
subject : "User created an account"
}
end
end
La entrega se activará en un gancho after_create
.
Instalar MailForm es muy fácil. Simplemente edite su Gemfile agregando lo siguiente:
gem 'mail_form'
Luego ejecute bundle install
para instalar MailForm .
Puede ejecutar rails generate mail_form
para ver información de ayuda sobre cómo generar un formulario básico para comenzar.
Declare los atributos de su formulario. Todos los atributos declarados aquí se agregarán al correo electrónico, excepto los que :captcha es verdadero.
Opciones:
:validate
: un gancho para validates_*_of
. Cuando se da true
, valida la presencia del atributo. Cuando es una expresión regular, valida el formato. Cuando es matriz, valida la inclusión del atributo en la matriz.
Siempre que se proporciona :validate
, la presencia se verifica automáticamente. Dé allow_blank: true
para anular.
Finalmente, cuando :validate
es un símbolo, se llamará al método dado como símbolo. Luego puede agregar validaciones como lo hace en Active Record ( errors.add
).
:attachment
: cuando se proporciona, espera que se envíe un archivo y lo adjunta al correo electrónico. No olvide configurar su formulario en multitipo. También acepta varios archivos a través de un único atributo de archivo adjunto y los adjuntará individualmente al correo electrónico.
:captcha
: cuando es verdadero, valida que los atributos deben estar en blanco. Esta es una forma sencilla de evitar el spam y la entrada debe ocultarse con CSS.
Ejemplos:
class ContactForm < MailForm :: Base
attributes :name , validate : true
attributes :email , validate : / A [^@ s ]+@[^@ s ]+ z /i
attributes :type , validate : [ "General" , "Interface bug" ]
attributes :message
attributes :screenshot , attachment : true , validate : :interface_bug?
attributes :nickname , captcha : true
def interface_bug?
if type == 'Interface bug' && screenshot . nil?
self . errors . add ( :screenshot , "can't be blank on interface bugs" )
end
end
end
c = ContactForm . new ( nickname : 'not_blank' , email : '[email protected]' , name : 'José' )
c . valid? #=> true
c . spam? #=> true (raises an error in development, to remember you to hide it)
c . deliver #=> false (just delivers if is not a spam and is valid, raises an error in development)
c = ContactForm . new ( email : 'invalid' )
c . valid? #=> false
c . errors . inspect #=> { name: :blank, email: :invalid }
c . errors . full_messages #=> [ "Name can't be blank", "Email is invalid" ]
c = ContactForm . new ( name : 'José' , email : '[email protected]' )
c . deliver
MailForm también facilita agregar información de solicitud del cliente al correo enviado. Sólo tienes que hacer:
class ContactForm < MailForm :: Base
append :remote_ip , :user_agent , :session
# ...
end
Y en tu controlador:
@contact_form = ContactForm . new ( params [ :contact_form ] )
@contact_form . request = request
La ip remota, agente de usuario y sesión se enviarán en el correo electrónico en una sesión de solicitud de información. Puede agregar cualquier método al que responda el objeto de solicitud.
I18n en MailForm funciona como en ActiveRecord, por lo que todos los modelos, atributos y mensajes se pueden usar localizados. A continuación se muestra un archivo de ejemplo de archivo I18n:
mail_form :
models :
contact_form : "Your site contact form"
attributes :
contact_form :
email : "E-mail"
telephone : "Telephone number"
message : "Sent message"
request :
title : "Technical information about the user"
remote_ip : "IP Address"
user_agent : "Browser"
Para personalizar la plantilla de correo electrónico que se utiliza, cree un archivo llamado contact.erb
en app/views/mail_form
. Eche un vistazo a lib/mail_form/views/mail_form/contact.erb
en este repositorio para ver cómo funciona la plantilla predeterminada.
Tenemos la intención de mantener el soporte para todas las versiones de Ruby/Rails que no hayan llegado al final de su vida útil.
Para obtener más información sobre versiones específicas, consulte las políticas de mantenimiento de Ruby y Rails y nuestra matriz de prueba.
Si descubre algún error, utilice el rastreador de problemas de github.
Licencia MIT. Copyright 2020-2024 Rafael França, Carlos Antônio da Silva. Copyright 2009-2019 Plataformatec.