Untuk penetapan nilai secara massal ke model ActiveRecord tanpa menyimpan, gunakan salah satu assign_attributes
atauattributes=
metode . Metode ini tersedia di Rails 3 dan yang lebih baru. Namun, ada perbedaan kecil dan yang terkait dengan versi gotcha yang harus diperhatikan.
Kedua metode mengikuti penggunaan ini:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
Perhatikan bahwa tidak ada metode yang akan melakukan validasi atau mengeksekusi panggilan balik; panggilan balik dan validasi akan terjadi ketikasave
dipanggil.
Rel 3
attributes=
sedikit berbeda dari assign_attributes
dalam Rails 3. attributes=
akan memeriksa bahwa argumen yang diteruskan ke Hash adalah, dan kembali segera jika tidak; assign_attributes
tidak memiliki pemeriksaan hash semacam itu. Lihat dokumentasi API Penugasan Atribut ActiveRecord untukattributes=
.
Kode tidak valid berikut akan gagal secara diam-diam dengan hanya mengembalikan tanpa menetapkan atribut:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
akan diam-diam bersikap seolah-olah penugasan itu berhasil, padahal sebenarnya tidak.
Kode yang tidak valid ini akan memunculkan eksepsi ketika assign_attributes
mencoba merangkai kunci hash dari array terlampir:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
akan memunculkan NoMethodError
pengecualian untuk stringify_keys
, menunjukkan bahwa argumen pertama bukan Hash. Pengecualian itu sendiri tidak terlalu informatif tentang penyebab sebenarnya, tetapi fakta bahwa pengecualian memang terjadi adalah sangat penting.
Satu-satunya perbedaan antara kasus-kasus ini adalah metode yang digunakan untuk penugasan massal: attributes=
berhasil dengan diam-diam, dan assign_attributes
menimbulkan pengecualian untuk menginformasikan bahwa telah terjadi kesalahan.
Contoh-contoh ini mungkin tampak dibuat-buat, dan mereka pada tingkat tertentu, tetapi jenis kesalahan ini dapat dengan mudah terjadi ketika mengkonversi data dari API, atau bahkan hanya menggunakan serangkaian transformasi data dan lupa dengan Hash[]
hasil akhir.map
. Pertahankan beberapa kode 50 baris di atas dan 3 fungsi dihapus dari penugasan atribut Anda, dan Anda punya resep untuk kegagalan.
Pelajaran dengan Rails 3 adalah ini: selalu gunakan assign_attributes
bukanattributes=
.
Rel 4
Di Rails 4, attributes=
hanyalah sebuah alias untuk assign_attributes
. Lihat dokumentasi API Penugasan Atribut ActiveRecord untukattributes=
.
Dengan Rails 4, metode mana pun dapat digunakan secara bergantian. Kegagalan untuk melewatkan Hash karena argumen pertama akan menghasilkan pengecualian yang sangat membantu:ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validasi
Jika Anda melakukan pra-penerbangan penugasan dalam persiapan untuk save
, Anda mungkin juga tertarik untuk memvalidasi sebelum menyimpan. Anda dapat menggunakan valid?
dan invalid?
metode untuk ini. Keduanya mengembalikan nilai boolean. valid?
mengembalikan true jika model yang belum disimpan melewati semua validasi atau false jika tidak. invalid?
hanyalah kebalikan darivalid?
valid?
dapat digunakan seperti ini:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
Ini akan memberi Anda kemampuan untuk menangani masalah validasi sebelum menelepon save
.