Pada kesempatan kali ini, saya ingin berbagi tips dalam melakukan impelementasi kustom validator. Rails memberikan banyak sekali validasi yang dapat anda gunakan seperti presence, length, numericaliy, inclusion, format. Ada kalanya anda ingin membuat sendiri validasi kustom yang dapat anda gunakan dalam melakukan validasi pada model.
Sebagai contoh misalnya anda ingin melakukan validasi pada nomor telepon dengan format "0411-3611419". Apabila user memasukkan nomor telepon dengan format 04113611419 maka validasi akan gagal. Dengan menggunakan kustom validasi, kita dapat menetapkan validasi sesuai dengan kondisi yang kita inginkan.
Pertama-tama dibuat terlebih dahulu file berisi validator yang akan kita gunakan. Pada contoh ini file-file validator ditempatkan didalam folder apps/validators. Folder ini tidak secara default dibuat oleh Rails, sehingga anda harus membuatnya sendiri. Dalam folder ini, akan diisi file berisi custom validator yang akan kita buat.
Untuk dapat mengatur agar Rails melakukan load ke dalam path validators ini, perlu anda tambahkan kode ke dalam config/application.rb agar Rails menambahkan path tersebut pada saat melakukan loading.
config.autoload_paths += %W("#{config.root}/app/validators")
Selanjutnya di dalam file yang akan kita jadikan validator, kita isi kode yang akan menjadi validator custom yang akan kita buat. Penamaan dari validator ini cukup krusial, format yang digunakan adalah "NameValidator" dimana name merupakan nama validator yang akan kita pakai. Sebagai contoh disini nama validator yang akan dipakai adalah phone, sehingga penamaan kelasnya menggunakan PhoneValidator.
Class PhoneValidator < ActiveRecord::EachValidator
def validate_each(record, attribute, value)
if not value =~ /\b[0-9]{3,4}-[0-9]{7,12}\b/
record.errors[attribute] << (options[:message] || "Please input valid Indonesian telephone number")
end
end
end
Cusom validator ini menggunakan inheritansi dari kelas ActiveRecord::EachValidator sebagai kelasnya. Kemudian digunakan method validate_each dengan argumen berupa record, attribute, dan value. Di dalamnya digunakan if condition dimana bila value tidak memenuhi syarat dari regex maka akan terjadi kegagalan dalam validasi dan kemudian akan diberikan pesan error ke dalam objek.
Setelah proses ini selesai, anda dapat mengimplementasikan custom validator ini kedalam model objek anda seperti contoh dibawah ini.
Selanjutnya untuk melakukan test secara dapat, anda dapat membuka rails console melalui command-line untuk melakukan pengecekan secara langsung.
Pada kode di atas, telephone diberikan nilai dengan string "xxx" yang merupakan format yang salah untuk dilakukan pengecekan apakah validasi error berhasil dijalankan. Dari hasil yang didapat terlihat bahwa validasi berhasil dilakukan dengan melihat pesan errors dengan key telephone. Selanjutnya dilakukan koreksi dengan format telepon yang benar, dan dilakukan validasi. Dapat dilihat bahwa pesan error sudah tidak ada kareana validasi yang dilakukan telah berhasil dan memenuhi syarat.
Semoga tips ini bermanfaat bagi anda. Happy Railings!!!