2015-04-11 13 views

cevap

24

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 
+0

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çı? '' –

+0

@WojciechBednarski 'yi kontrol etmeniz gerekmez. Bu yüzden varsayılan değer sadece nesne yeni ve kalıcı değilken ayarlanıyor. –

+1

'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. –

1

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.

6

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 
İlgili konular