Pada artikel sebelumnya, kita telah mempelajari mengenai Active Record dan penggunaan Active Record pada Rails. Sebagai contoh pada tutorial sebelumnya, kita membuat aplikasi homework management yang berfungsi untuk melakukan manajemen tugas harian sekolah ataupun tugas kuliah.
Pada aplikasi tersebut terdapat dua buah model, yaitu category dan homework. Selain itu, pada aplikasi juga terdapat dua buah tabel, yaitu tabel categories dan tabel homeworks.
Aplikasi ini sudah bisa melakukan CRUD. Akan tetapi, aplikasi yang dibuat masih sederhana. Misalnya saja, jika user melakukan pengisian data homework baru dan pada salah satu kolom tidak diisi, data tersebut masih bisa masuk ke dalam database. Untuk itulah dibutuhkan validasi. Terakhir kali, tampilan aplikasi yang sudah kita buat adalah sebagai berikut.
Pada aplikasi tersebut terdapat dua buah model, yaitu category dan homework. Selain itu, pada aplikasi juga terdapat dua buah tabel, yaitu tabel categories dan tabel homeworks.
Aplikasi ini sudah bisa melakukan CRUD. Akan tetapi, aplikasi yang dibuat masih sederhana. Misalnya saja, jika user melakukan pengisian data homework baru dan pada salah satu kolom tidak diisi, data tersebut masih bisa masuk ke dalam database. Untuk itulah dibutuhkan validasi. Terakhir kali, tampilan aplikasi yang sudah kita buat adalah sebagai berikut.
A. VALIDASI
Apa itu Validasi ?
Validasi digunakan untuk memastikan hanya data yang valid yang dapat masuk ke database. Contohnya, mungkin saja penting untuk memastikan bahwa user melakukan pengisian nama kategori yang valid pada aplikasi yang dibuat.
Pada rails, validasi dapat dilakukan dengan beberapa cara, yaitu:
- Database constraintDatabase constraint disini maksudnya adalah pembatasan yang dilakukan pada sisi database. Contoh constraint adalah bahwa email pada tabel user haruslah bersifat unique. Pada rails, validasi menggunakan database constraint dapat dilakukan di model.
- Client-side validationClient-side validation adalah validasi yang dilakukan pada sisi klien. Contohnya adalah penggunaan javascript/jquery untuk memvalidasi bahwa pada kolom email harus mengandung "@" dan "."
- Controller validationController validation, ini dilakukan pada controller, biasanya ini dilakukan sebelum pemrosesan data ke database.
Kapan terjadinya validasi ?
Validasi akan terjadi sebelum proses penyimpanan data ke database. Penyimpanan pada database, terbagi menjadi dua, yaitu:
- Penyimpanan object baru
- Penyimpanan terhadap object yang sudah ada (update)
Jika proses validasi menghasilkan error, maka Rails tidak akan melanjutkan proses penyimpanan data. Error ini akan menghasilkan message yang dapat ditampilkan pada view dengan menggunakan method errors.messages
Validation Helper
Active Record menyediakan banyak pre-defined validation helper yang dapat digunakan langsung pada model. Setiap validasi menghasilkan false,error message yang dihasilkan akan dimasukkan ke dalam errors collection.
- acceptanceMethod ini memvalidasi bahwa suatu checkbox dalam suatu form telah dicheckclass Person < ApplicationRecordvalidates :terms_of_service, acceptance: true #user harus mencentang checkbox terms_of_serviceend
- validates_associated
Helper ini dapat digunakan ketika suatu model mempunyai hubungan dengan model lainnya. Jadi helper ini akan memvalidasi model itu sendiri dan model yang berkaitan.
class Homework < ApplicationRecordhas_many :categoriesvalidates_associated :categoriesend - confirmationHelper ini dapat digunakan ketika terdapat dua text field yang harus menerima isi yang sama. Contohnya, jika pada aplikasi dibutuhkan konfirmasi sebuah email atau password.Validasi ini akan membuat virtual attribute dengan nama dari field yang harus dikonfirmasi dengan kata "_confirmation" pada akhir attribut tersebut.class Person < ApplicationRecordvalidates :email, confirmation: trueend
- lengthDigunakan untuk memvalidasi panjang dari suatu nilai pada attribut.class Category < ApplicationRecordvalidates :name, length: { minimum: 2 } #field name ini tidak boleh memiliki panjang kurang dari 2 karakterend
- numericalityDigunakan untuk melakukan validasi bahwa nilai pada suatu attribut hanya memiliki numeric values
- presenceHelper ini digunakan untuk melakukan validasi bahwa suatu attribut harus diisi.class Category < ApplicationRecordvalidates :name, presence: true #field name ini harus diisiend
- absenceHelper ini digunakan untuk melakukan validasi bahwa suatu attribut tidak boleh diisi.
- uniquenessDigunakan untuk memvalidasi bahwa suatu nilai harus bersifat unique atau tidak boleh samaclass Category < ApplicationRecordvalidates :name, uniqueness: trueend
- exclusion
- format
- validates_with
- validates_each
Validasi di Rails juga memiliki beberapa opsi/pilihan, yaitu
- :allow_nil
Opsi ini mengizinkan suatu attribut bernilai nil - :allow_blank
Opsi ini hampir sama dengan :allow nil, perbedaannya yaitu opsi ini memperbolehkan suatu attribut bernilai kosong. - :message
Digunakan untuk melakukan custom message jika suatu validasi bernilai false - :on
Opsi ini mengizinkan kita untuk menentukan kapan validasi harus dilakukan. Secara default, semua validasi dilakukan pada saat proses menyimpan, baik saat proses create atau update.
Conditional Validation
Terkadang kita menginginkan suatu validasi hanya dijalankan pada saat kondisi-kondisi tertentu. Pada Rails, hal ini dapat dilakukan dengan menggunakan :if atau :unless
Custom Validation
Rails memang menyediakan helper yang dapat digunakan untuk melakukan validasi. Namun ada kalanya, validasi yang diperlukan lebih complex. Untuk megatasi masalah tersebut dapat dilakukan dengan cara membuat validasi sendiri (custom). Contohnya, jika pada suatu aplikasi, user harus memasukkan email yang valid.
Scope validation
digunakan untuk validasi terhadap coloum tertentu
Implementasi Validasi pada Aplikasi
Setelah mengetahui mengenai validasi pada Rails, kita coba implemetasikan pada aplikasi yang telah dibuat sebelumnya, yaitu aplikasi homework management.
Pada aplikasi terdapat dua buah table, yaitu table homework dan category (berisi nama jadwal pelajaran).
Buka model category dan homework pada folder app/models.
Pada model category, kita tambahkan validasi sebagai berikut.
Sedangkan pada model homework, tambahkan validasi sebagai berikut.
Cara Menampilkan Pesan Error ketika Meggunakan Validasi
Di atas validasi telah dibuat, namun bagaimana caraya agar user mengetahui letak kesalahan dalam pegisian sebuah data ?. Caranya adalah tentu dengan menampilkan message error tersebut ke dalam tampilan user. Pada Rails, untuk menampilkan message error pada view (tampilan), dapat dilakukan dengan cara berikut.Contohnya, kita akan menampilkan mesage error yang dihasilkan ketika melakukan penambahan data homework. Artinya, kita akan menampilkan message error ketika proses create data. Maka, yang harus dilakukan adalah buka file homework_controller pada folder app/controller. Tambahkan script berikut.
Pada bagian yg di dalamya terdapat form untuk menambahkan data baru, tambahkan script seperti berikut.
Kita coba jalankan aplikasi dengan menjalankan perintah rails s di terminal. Kita akan mencoba validasi yang telah dibuat, apakah berhasil atau tidak ?. Berikut contoh form tambah data homework.
Form Menambahkan Data Homework |
Message Error pada Halaman Tambah Data Homework |
B. Relasi
Apa itu Relasi ?
Pada aplikasi homework management yg telah dibuat telah dijelaskan di atas bahwa aplikasi ini memiliki dua buah tabel dan model, yaitu:
- Tabel categories dan model category untuk menyimpan nama jadwal pelajaran
- Tabel homeworks dan model homework untuk menyimpan data tugas
Pada aplikasi tersebut, sistem CRUD pada data homework dan data category sudah dapat dilakukan. Berikut tampilan form untuk melakukan penambahan data homework dan data category.
Form Menambahkan Data Homework |
Form Menambahkan Data Category |
Jadi kesimpulannya, relasi adalah hubungan antara dua atau lebih tabel yang sehingga memiliki keterkaitan.
Jika kita pikirkan dari kedua tabel tersebut, maka terdapat kesimpulan jika:
- Data homework hanya diwakili oleh satu category
- Data category mewakili banyak data pada homework
Lalu bagaimana cara membuat relasi ini pada Rails ?.
Cara Mendifinisikan Relationship di Rails
Untuk mendefinisikan relationship di Rails, kita dapat melakukannya di model. Relasi pada Rails, terdapat beberapa macam, yaitu:
- belongs_to
Ini seperti one-to-one. Contohnya terdapat tabel buku dan pengarang, dimana satu buku diwakili hanya oleh satu pengarang. - has_one
Contohnya jika terdapat tabel supplier dimana satu supplier hanya memiliki satu account - has_many
Contohnya jika terdapat tabel buku dan pengarang, dimana pengarang telah mengarang banyak buku, yang artinya pengarang bisa mewakili banyak buku yang berbeda. - has_many :through
- has_one :through
- has_and_belongs_to_many
Pada aplikasi homework management sesuai dengan kesimpulan berikut
- Data homework hanya diwakili oleh satu category
- Data category mewakili banyak data pada homework
Maka kita dapat menggunakan belongs_to pada model homework, dan has_many pada model category. Kita implementasikan pada model category seperti berikut.
Sedangkan pada model homework, kita dapat mendefinisikan relationshipnya seperti berikut.
Lalu kita ubah sistem input data homework pada bagian field category, sehingga category yang dimasukkan berdasarkan data category yang sudah ada. Pertama, kita ubah struktur migration homework untuk menambahkan kolom category_id dengan cara seperti berikut pada terminal.
Migrate migrasi dengan cara mengetikkan perintah berikut pada terminal
Kita ubah pada bagian field category
menjadi seperti berikut.
Setelah itu, tambahkan script berikut pada homework_controller.
Jangan lupa untuk memperhatikan param yg akan diproses untuk melakukan penambahan atau pengubahan data. Pada contoh kali ini, saya memasukkan param[:category] ketika belum adanya relasi antara model homework dan category. Lalu tadi kita telah menambahkan kolom baru, yaitu category_id. Jadi, kita juga harus menambahkan param[:category_id]
Untuk menampilkan data yang berelasi sesuai dengan yang sudah kita buat antara model category dan homework, bisa dilakukan dengan cara-cara berikut.
Sedangkan pada model homework, kita dapat mendefinisikan relationshipnya seperti berikut.
Lalu kita ubah sistem input data homework pada bagian field category, sehingga category yang dimasukkan berdasarkan data category yang sudah ada. Pertama, kita ubah struktur migration homework untuk menambahkan kolom category_id dengan cara seperti berikut pada terminal.
rails g migration AddCategoryIdToHomework
Setelah itu buka file migrationnya pada folder db/migrate, dan tambahkan script berikut.Migrate migrasi dengan cara mengetikkan perintah berikut pada terminal
rake db:migrate
Lalu kita ubah tampilan form untuk menambahkan data atau update data homework. Sebelumnya pada field category berupa textbox, seperti berikut.Kita ubah pada bagian field category
menjadi seperti berikut.
Setelah itu, tambahkan script berikut pada homework_controller.
Jangan lupa untuk memperhatikan param yg akan diproses untuk melakukan penambahan atau pengubahan data. Pada contoh kali ini, saya memasukkan param[:category] ketika belum adanya relasi antara model homework dan category. Lalu tadi kita telah menambahkan kolom baru, yaitu category_id. Jadi, kita juga harus menambahkan param[:category_id]
Apabila masih terdapat error validasi saat kita menambahkan data, jangan lupa kita ubah parameter category menjadi category_id pada method homework_params pada bagian private di controller.
Bagaimana untuk Menampilkan Data yang Berelasi ?
Untuk menampilkan data yang berelasi sesuai dengan yang sudah kita buat antara model category dan homework, bisa dilakukan dengan cara-cara berikut.
C. Scope
Rails menyediakan fungsi scope agar developer bisa menggunakan code secara DRY (Don't Repeat Yourself). Scope digunakan untuk memberikan nama dan condition suatu pemanggilan data.
Contohnya, jika pada aplikasi setiap menampilkan data category atau data homework, kita mengiginkan data tersebut untuk selalu tampil dari data terbaru.
Penggunaan scope dapat dilakukan dengan berbagai cara
- Default Scope
Scope ini digunakan jika ketika melakukan pemanggilan data dalam suatu model harus selalu berdasarkan kondisi tertentu. Misalnya saja, jika data harus selalu ditampilkan menurut nama homework. - Menerima Argumen
Scope juga bisa menerima argumen jika memang dibutuhkan, biasanya ini digunakan pada controller. Contohnhya saja, jika kita ingin mencari data homework yang dibuat berdasarkan waktu tertentu. - Menggunakan Kondisi
- Merging Scope
Pembahasan materi mengenai pembelajaran validasi, relationship, serta scope di Ruby on Rails diharapkan dapat dimengerti dan dapat menjadi salah satu sumber pembelajaran Rails.
"Happy Coding!"
Fathara Annisa Azka | C-aio Indonesia
Komentar ini telah dihapus oleh pengarang.
BalasHapus