Varsayılan değeri taşıma veya geri aramada ayarlamak daha iyi midir? Taşıma işleminde silme (veya başka bir ayar) varsayılan değeri zor, ancak modelde kodun bir parçası dahaRaylardaki modeller için varsayılan değerler
cevap
Taşıma işleminde varsayılanları tanımlamak da bazı dezavantajlara sahiptir. Bu sadece Model.new
aradığınızda çalışmaz. , Arka uçta, Genel bir kural olarak
class Model < ActiveRecord::Base
after_initialize :set_defaults, unless: :persisted?
# The set_defaults will only work if the object is new
def set_defaults
self.attribute ||= 'some value'
self.bool_field = true if self.bool_field.nil?
end
end
modellerinde ve DB kısıtlamaları uygulamak:
Bana ayarlanan varsayılan özelliklerini sağlayan after_initialize
geri arama, yazmayı tercih ediyorum. Onaylama JS'si gibidir ve arka taraftaki (PHP, ROR, vb.) Doğrulama yapmaz. Birisi doğrulama işlemini geçmek için JS'nizi değiştirebilir ve arka planda doğrulama yapmadığınız için sitenizde güvenlik açığı olabilir. Bu nedenle, her zaman her iki yönde de doğrulayın, en azından uygulama sunucunuz uzlaşırsa, DB sunucusu bir miktar savunma yapabilir.
Raylar 5'te, attributes API, varsayılan değerlerin belirtilmesine izin verir. Sözdizimi basittir ve bir geçiş olmadan bir varsayılanı değiştirmenize izin verir.
# db/schema.rb
create_table :store_listings, force: true do |t|
t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
attribute :my_string, :string, default: "new default"
end
Neden 'before_create'? o zaman, eğer 'before_create' varolan değeri geçersiz kılacağından ve nesnenin değerleri zaten varsa varsayılan değeri ayarlamak istemediğinden, '' inatçı? '' –
@WojciechBednarski 'yi kontrol etmeniz gerekmez. Bu yüzden varsayılan değer sadece nesne yeni ve kalıcı değilken ayarlanıyor. –
'before_create', DB satırında modelin kullanım ömründe yalnızca bir kez patlayacaktır. 'before_update', DB'deki modeli değiştirdiğinizde her zaman tetiklenir. –