Permata ini dibuat di atas ActiveModel
untuk menunjukkan bagaimana Anda dapat melakukan validasi, penamaan, dan i18n
dari Rails ke model Anda tanpa perlu mengimplementasikan semuanya sendiri.
README ini mengacu pada permata MailForm yang akan digunakan di Rails 5+. Untuk instruksi tentang cara menggunakan MailForm di Rails versi lama, silakan merujuk ke cabang yang tersedia.
MailForm memungkinkan Anda mengirim email langsung dari formulir. Misalnya, jika Anda ingin membuat formulir kontak, cukup baris berikut saja yang diperlukan (termasuk email):
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
Kemudian Anda memulai konsol dengan rails console
dan mengetik:
>> c = ContactForm . new ( name : 'José' , email : '[email protected]' , message : 'Cool!' )
>> c . deliver
Periksa kotak masuk Anda dan email akan ada di sana, dengan kolom terkirim (dengan asumsi Anda mengkonfigurasi metode pengiriman surat dengan benar).
Saat Anda mewarisi dari MailForm::Base
, ia menarik serangkaian hal dari ActiveModel
, seperti ActiveModel::Validation
, ActiveModel::Translation
dan ActiveModel::Naming
.
Ini membawa I18n
, pesan kesalahan, validasi dan penanganan atribut seperti di ActiveRecord
ke MailForm , sehingga MailForm dapat digunakan di pengontrol dan pembuat formulir Anda tanpa penyesuaian tambahan. Ini juga berarti bahwa alih-alih melakukan hal berikut:
attribute :email , validate : / A [^@ s ]+@[^@ s ]+ z /i
Anda sebenarnya bisa melakukan ini:
attribute :email
validates_format_of :email , with : / A [^@ s ]+@[^@ s ]+ z /i
Pilih salah satu yang paling menyenangkan Anda. Untuk informasi lebih lanjut mengenai API, silakan lanjutkan membaca di bawah.
MailForm juga berfungsi baik dengan ORM. Anda hanya perlu menyertakan MailForm::Delivery
dalam model Anda dan menyatakan atribut mana yang harus dikirim:
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
Pengiriman akan dipicu di hook after_create
.
Instal MailForm sangat mudah. Cukup edit Gemfile Anda dengan menambahkan yang berikut:
gem 'mail_form'
Kemudian jalankan bundle install
untuk menginstal MailForm .
Anda dapat menjalankan rails generate mail_form
untuk melihat informasi bantuan tentang cara membuat formulir dasar untuk membantu Anda memulai.
Deklarasikan atribut formulir Anda. Semua atribut yang dideklarasikan di sini akan ditambahkan ke email, kecuali yang :captcha benar.
Pilihan:
:validate
- Kait ke validates_*_of
. Ketika true
diberikan, memvalidasi keberadaan atribut. Saat regexp, validasi format. Saat array, memvalidasi penyertaan atribut dalam array.
Setiap kali :validate
diberikan, keberadaannya diperiksa secara otomatis. Berikan allow_blank: true
untuk diganti.
Terakhir, jika :validate
adalah sebuah simbol, metode yang diberikan sebagai simbol akan dipanggil. Kemudian Anda dapat menambahkan validasi seperti yang Anda lakukan di Rekaman Aktif ( errors.add
).
:attachment
- Ketika diberikan, mengharapkan file untuk dikirim dan melampirkannya ke email. Jangan lupa untuk mengatur formulir Anda menjadi multitype. Ia juga menerima banyak file melalui satu atribut lampiran, dan akan melampirkannya satu per satu ke email.
:captcha
- Jika benar, atribut yang divalidasi harus kosong. Ini adalah cara sederhana untuk menghindari spam dan masukannya harus disembunyikan dengan CSS.
Contoh:
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 juga memudahkan untuk menambahkan informasi permintaan dari klien ke email yang dikirim. Anda hanya perlu melakukan:
class ContactForm < MailForm :: Base
append :remote_ip , :user_agent , :session
# ...
end
Dan di pengontrol Anda:
@contact_form = ContactForm . new ( params [ :contact_form ] )
@contact_form . request = request
IP jarak jauh, agen pengguna, dan sesi akan dikirim melalui email dalam sesi informasi permintaan. Anda dapat memberikan untuk menambahkan metode apa pun yang ditanggapi oleh objek permintaan.
I18n di MailForm berfungsi seperti di ActiveRecord, sehingga semua model, atribut, dan pesan dapat digunakan dengan lokal. Di bawah ini adalah contoh file 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"
Untuk menyesuaikan template email yang digunakan, buat file bernama contact.erb
di app/views/mail_form
. Lihatlah lib/mail_form/views/mail_form/contact.erb
di repo ini untuk melihat cara kerja templat default.
Kami bermaksud mempertahankan dukungan untuk semua versi Ruby/Rails yang belum mencapai akhir masa pakainya.
Untuk informasi lebih lanjut tentang versi tertentu, silakan periksa kebijakan pemeliharaan Ruby dan Rails, serta matriks pengujian kami.
Jika Anda menemukan bug apa pun, silakan gunakan pelacak masalah github.
Lisensi MIT. Hak Cipta 2020-2024 Rafael França, Carlos Antônio da Silva. Hak Cipta 2009-2019 Plataformatec.