2011-10-23 25 views
5

İşte kod:Mongoid: Tanımlanmamış alanların toplu atama ile oluşturulmasını nasıl önleyebilirim?

class M 
    include Mongoid::Document 
    field :name 
end 

params = { name: "foo", age: 20 } 
M.create(params) 
#=> #<M name: "My Name", age: 20> 

Bildirim age olduğu tanımlanmamış, henüz kurtuldu.

kötü niyetli bir kullanıcı gizlice çıkarabileceğiniz büyük dize ile herhangi POST parametreleri ve bilinmeyen alanları ekleyebilirsiniz, çünkü bu (DoS potansiyel bir kaynağı) problemlidir. (Örn name=foo&bogus=#{'x'*1000000})

Şimdiye kadar, ben yapamadım attr_accessible'dan başka bir şey bulamazsınız, ancak Mongons için gerçekten harika değildir, çünkü tüm modellerde her zaman field ve attr_accessible aynı alan adlarını korumak zorundasınız. Kuru değil.

attr_accessible API'sinin ActiveRecord için mükemmel olduğunu düşünüyorum, çünkü a. modellerde (DRY) ve b alanlarını açıkça tanımlamayın., varolmayan bir alanın RDB'ye kaydedilme şansı olmadığı garantilidir. Fakat Mongoid için, bence attr_accessible'dan daha iyi bir çözüm olmalı.

orada allow_dynamic_fields ayarı global bir yapılandırma var fakat bu tartışmada kapsam dışında bulunuyor bu yüzden ancak aslında bir başına modeli makro olması gerektiğini düşünüyorum ve aynı zamanda kitle atama dikkatli olmalıdır, kitle atama ilgisi olmadığını

Not.

Bu problemi nasıl çözüyorsunuz?

+1

Bunun için bir çözüm buldunuz mu? Aynı konuyla da ilgileniyorum. – Rohit

cevap

1

Modellerde her zaman attr_accessible kullanıyorum. Tüm alanları da dahil olmak üzere kendimi nadiren buldum. Genellikle her zaman kitle ataması için erişilebilir olmaması gereken birkaç alan vardır. Sık sık her öznitelik eklemek gerekiyor ve çoğaltma konusunda endişeleriniz varsa:

set_callback(:save, :before) do |doc| 
    (doc.attributes.keys - fields.keys).each { |f| doc.unset(f) } 
end 

Bu:

Bu sorunu çözmek için ne yaptın
attr_accessible *fields.keys 
0

, benim modelinde bir önce kaydetmek geri arama kullanmaktır yol, kaydedilmeden önce çıkardıkları ekstra özellikler olsa bile.

İlgili konular