Part 2: Membuat email newsletter di Rails
Di bagian pertama kita sudah membuat form sederhana yang menerima input email, tetapi secara fungsionalitas masih belum bekerja. Ketika submit ditekan dia justru akan redirect ke halaman home.
Di bagian ini kita kita akan membuat validasi email dari server; Dan jika valid selanjutnya akan menyimpannya ke database.
Bagaimana jika email tidak valid? Kita akan mengirim pesan error. Di bagian pertama, sebetulnya validasi pertama kita sudah memakai type="email"
di input tag. Tetapi jika browser tidak compatible dengan type="email"
, server akan memvalidasi lagi.
Subscriber Model
rails g model Subscriber email:string register_ip_address:string register_user_agent:string
Perintah di atas akan membuat file migration dan model. Hanya saja kita perlu sedikit modifikasi untuk menambahkan constrain unique.
# db/migrate/xxxxxxxxxxxxx_create_subscribers.rb
class CreateSubscribers < ActiveRecord::Migration[7.1]
def change
create_table :subscribers do |t|
t.string :email, null: false, index: { unique: true }
t.string :register_ip_address
t.string :register_user_agent
t.timestamps
end
end
end
Tambah validasi di bagiam model.
# app/models/subscriber.rb
class Subscriber < ApplicationRecord
validates :email, presence: true, { message: "Alamat email belum diisi" }
validates :email, uniqueness: true, { message: "Alamat email sudah terdaftar" }, on: :create
end
Tetapi validasi ini hanya memeriksa apakah email diisi dan apakah email yang dimasukan sudah terdaftar atau belum. Untuk membuat validasi email, kita akan membuat custom validation, mencontek dari [doc rails].
Di dalam direktori app/models/concerns
, kita buat file bernama email_validator.rb
.
# app/models/concerns/model_validator.rb
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless URI::MailTo::EMAIL_REGEXP.match?(value)
record.errors.add attribute, (options[:message] || "is not an email")
end
end
end
Sehingga, model subscriber.rb
menjadi:
# app/models/subscriber.rb
class Subscriber < ApplicationRecord
validates :email, presence: true, { message: "Alamat email belum diisi" }
validates :email, email: true, { message: "Alamat email tidak jelas" }
validates :email, uniqueness: true, { message: "Alamat email sudah terdaftar" }, on: :create
end