Kaydetmeden bir ActiveRecord modeline değerlerin toplu olarak atanması için assign_attributes
veyaattributes=
yöntemlerinden . Bu yöntemler Rails 3 ve daha yeni sürümlerde mevcuttur. Ancak, farkında olmak için ufak farklılıklar ve versiyonla ilgili gotcha'lar vardır.
Her iki yöntem de bu kullanımı izler:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
Her iki yöntemin de doğrulama yapmayacağını veya geri çağrı yapmayacağını unutmayın; Geri aramalar ve doğrulama,save
çağrıldığında gerçekleşir.
Raylar 3
attributes=
assign_attributes
Rails 3'ten biraz farklıdır . Kendisine attributes=
iletilen argümanın Karma olup olmadığını kontrol eder ve değilse hemen döner; assign_attributes
böyle bir Hash kontrolü yok. İçin ActiveRecord Özellik Atama API'sı belgelerine bakınattributes=
.
Aşağıdaki geçersiz kod, öznitelikleri ayarlamadan geri dönerek sessizce başarısız olacaktır:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
ödevler başarılı bir şekilde yapılmış gibi sessizce davranacaklar, gerçekten değillerdi.
assign_attributes
Ekleyen dizinin karma anahtarlarını dizginlemeye çalıştığında bu geçersiz kod bir istisna oluşturur:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
, ilk argümanın Karma olmadığını belirten bir NoMethodError
istisna oluşturur stringify_keys
. İstisnanın kendisi gerçek neden hakkında çok bilgilendirici değildir, ancak bir istisnanın gerçekleşmesi gerçeği çok önemlidir.
Bu durumlar arasındaki tek fark, toplu atama için kullanılan yöntemdir: attributes=
sessizce başarılı olur ve assign_attributes
bir hata oluştuğunu bildirmek için bir istisna oluşturur.
Bu örnekler tutarlı görünebilir ve bir dereceye kadar olabilirler, ancak bu tür bir hata bir API'dan veri dönüştürülürken veya hatta sadece bir dizi veri dönüşümü kullanılırken ve Hash[]
finalin sonuçlarını unuturken kolayca ortaya çıkabilir .map
. Bazı kodları 50 satır yukarıda tutun ve öznitelik atamanızdan 3 işlev kaldırıldı ve başarısızlık için bir reçeteniz var.
Raylar 3 ile ders şudur: her zaman kullanmak assign_attributes
yerineattributes=
.
Raylar 4
Rails 4, attributes=
sadece bir takma addır assign_attributes
. İçin ActiveRecord Özellik Atama API'sı belgelerine bakınattributes=
.
Rails 4 ile, her iki yöntem de birbirinin yerine kullanılabilir. İlk argüman olarak bir Hash'i geçememek çok yararlı bir istisna ile sonuçlanır:ArgumentError: When assigning attributes, you must pass a hash as an argument.
Doğrulamaları
A'ya hazırlanırken ödevleri önceden yayınlıyorsanız save
, kaydetmeden önce de doğrulamak isteyebilirsiniz. Bunun için valid?
ve invalid?
yöntemlerini kullanabilirsiniz . Her ikisi de boole değerlerini döndürür. valid?
kaydedilmemiş model tüm doğrulamaları geçerse true değerini, değilse false değerini döndürür. invalid?
basitçe tersidirvalid?
valid?
şu şekilde kullanılabilir:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
Bu, aramadan önce herhangi bir doğrulama sorununu ele alma olanağı verecektir save
.