Jadi saya telah melihat orang yang menggunakan .build
, .create
dan .create!
dalam pengendali mereka lebih dan lebih akhir-akhir ini. Apa bedanya hanya menggunakan .new
dan melewatkan objek param'd lalu .save
? Apakah ada pro dan kontra? Apakah menggunakan metode-metode lain ini menawarkan manfaat?
ruby-on-rails
Tim Knight
sumber
sumber
Meskipun benar bahwa
create
panggilannew
dan kemudiansave
ada perbedaan besar antara dua alternatif dalam nilai pengembaliannya.Save
mengembalikan salah satutrue
ataufalse
tergantung pada apakah objek berhasil disimpan ke database atau tidak. Ini kemudian dapat digunakan untuk kontrol aliran sesuai contoh pertama dalam pertanyaan di atas.Create
akan mengembalikan model terlepas dari apakah objek itu disimpan atau tidak. Ini memiliki implikasi untuk kode di atas bahwa cabang atasif
pernyataan akan selalu dieksekusi bahkan jika objek gagal validasi dan tidak disimpan.Jika Anda menggunakan
create
dengan logika percabangan Anda berisiko gagal diam yang tidak terjadi jika Anda menggunakannew
+save
.create!
tidak mengalami masalah yang sama seperti yang timbul dan pengecualian jika catatan tidak valid.The
create
alternatif dapat berguna dalam controller di manarespond_with
digunakan untuk API (JSON / XML) tanggapan. Dalam hal ini keberadaan kesalahan pada objek akan menyebabkan kesalahan dikembalikan dalam respons dengan statusunprocessable_entity
, yang persis seperti yang Anda inginkan dari API.Saya akan selalu menggunakan opsi
new
+save
untuk html, terutama jika Anda mengandalkan nilai balik untuk kontrol aliran.sumber
#create adalah versi yang lebih baru dan simpan. #membuat! melempar pengecualian jika validasi tidak positif.
sumber
Saya akan menjawab kedua jawaban di atas. Plus untuk
create
, seseorang tidak dapat lulusfalse
sebagai argumen yang dapat Anda lakukansave
. Melewatifalse
sebagai argumen akan melewati semua validasi relsumber