這個 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。