Blog index

Part 2: Membuat email newsletter di Rails

Dibuat pada:

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