这个 gem 构建在ActiveModel
之上,展示了如何将验证、命名和i18n
从 Rails 引入到您的模型中,而无需自己全部实现。
本自述文件引用了 Rails 5+ 中使用的MailForm gem。有关如何在旧版本的 Rails 中使用 MailForm 的说明,请参阅可用的分支。
MailForm允许您直接从表单发送电子邮件。例如,如果您想制作联系表格,则只需以下几行(包括电子邮件):
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
然后使用rails console
启动控制台并输入:
>> c = ContactForm . new ( name : 'José' , email : '[email protected]' , message : 'Cool!' )
>> c . deliver
检查您的收件箱,电子邮件将在那里,其中包含已发送字段(假设您正确配置了邮件程序传递方法)。
当您继承MailForm::Base
时,它会从ActiveModel
中获取一组内容,如ActiveModel::Validation
、 ActiveModel::Translation
和ActiveModel::Naming
。
这将I18n
、错误消息、验证和属性处理(如ActiveRecord
中的处理)引入MailForm中,因此MailForm可以在您的控制器和表单构建器中使用,无需额外的调整。这也意味着,而不是以下内容:
attribute :email , validate : / A [^@ s ]+@[^@ s ]+ z /i
你实际上可以这样做:
attribute :email
validates_format_of :email , with : / A [^@ s ]+@[^@ s ]+ z /i
选择最让您满意的一项。有关 API 的更多信息,请继续阅读下文。
MailForm也能很好地与 ORM 配合使用。您只需在模型中包含MailForm::Delivery
并声明应发送哪些属性:
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
交付将在after_create
挂钩中触发。
安装MailForm非常简单。只需编辑 Gemfile 添加以下内容:
gem 'mail_form'
然后运行bundle install
来安装MailForm 。
您可以运行rails generate mail_form
来查看有关如何生成基本表单的帮助信息以帮助您入门。
声明您的表单属性。此处声明的所有属性都将附加到电子邮件中,但 :captcha 为 true 的属性除外。
选项:
:validate
- validates_*_of
钩子。当给出true
时,验证属性的存在。当使用正则表达式时,验证格式。当为数组时,验证数组中是否包含该属性。
每当给出:validate
时,都会自动检查是否存在。给allow_blank: true
覆盖。
最后,当:validate
是一个符号时,将调用作为符号给出的方法。然后,您可以像在 Active Record 中一样添加验证 ( errors.add
)。
:attachment
- 当给出时,期望发送一个文件并将其附加到电子邮件中。不要忘记将表单设置为多种类型。它还通过单个附件属性接受多个文件,并将它们单独附加到电子邮件中。
:captcha
- 如果为 true,则验证属性必须为空。这是避免垃圾邮件的简单方法,并且应使用 CSS 隐藏输入。
示例:
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还可以轻松地将来自客户端的请求信息附加到发送的邮件中。你只需要做:
class ContactForm < MailForm :: Base
append :remote_ip , :user_agent , :session
# ...
end
在你的控制器中:
@contact_form = ContactForm . new ( params [ :contact_form ] )
@contact_form . request = request
远程 IP、用户代理和会话将在请求信息会话的电子邮件中发送。您可以附加请求对象响应的任何方法。
MailForm中的 I18n 工作方式与 ActiveRecord 中类似,因此所有模型、属性和消息都可以本地化使用。以下是 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"
要自定义所使用的电子邮件模板,请在app/views/mail_form
中创建一个名为contact.erb
的文件。查看此存储库中的lib/mail_form/views/mail_form/contact.erb
以了解默认模板的工作原理。
我们打算维持对所有尚未终止生命周期的 Ruby / Rails 版本的支持。
有关特定版本的更多信息,请查看 Ruby 和 Rails 维护政策以及我们的测试矩阵。
如果您发现任何错误,请使用 github 问题跟踪器。
麻省理工学院许可证。版权所有 2020-2024 拉斐尔·弗兰萨 (Rafael França)、卡洛斯·安东尼奥·达席尔瓦 (Carlos Antônio da Silva)。版权所有 2009-2019 Plataformatec。