2010-10-06 26 views
5

Raylarda, bir modeli güncellerken, modelin belirli özelliklerinin güncellenmesini nasıl önlersiniz:Belirli özelliklerin güncellenmesini engelle?

@user.update_profile params[:user] 

Herkes sadece 'parola' gibi bir adla form girdisi oluşturabilir, Güncellenmeye izin verdiğiniz özellik kümesini nasıl filtreleyebilirsiniz?

Bu ne attr_XXX nedir?

+1

Beyaz Listede olarak atanmış ise

N.B Korunan özellikler hala üzerine yazılabilir, beyaz liste önerilir. – Swanand

cevap

6

attr_accessible adlı kullanıcıyı arıyor. Kitle güncellemesiyle (update_attributes gibi) hangi özniteliklerin ayarlanabileceğini belirtmenize izin verir, ancak yine de "el ile" özelliklerini (@user.attribute = ...) ayarlayabilirsiniz.

Daha fazla bilgi için bkz. The importance of attr_accessible in Ruby on Rails.

+0

tamam, böylece form yazılarında vb. – Blankman

+0

@Blankman Doğru, erişilebilir olarak belirtilmeyen tüm özellikler, "params" aracılığıyla güncellenemez. –

4

Toplu bir güncellemede değiştirilmesini istediğiniz özellikleri kara listeye attr_protected için bekliyorsunuz. Modelinize atın ve kara listeye öznitelik sembolleri listesi verin.

class User < ActiveRecord::Base 
    attr_protected :password 
end 

Alternatif beyaz liste yaklaşımı ve bir kerede tüm kaydı güncellerken güncellenebilir verilen sadece özelliklerini almaya attr_accessible kullanabilirsiniz. Diğer her özellik korunacaktır. doğrudan kara liste vs

@user.password = "not secure" 
+2

Dikkat et "attr_protected" ve "attr_accessible" (cevabımda bahsettiğim), aynı madalyonun iki yüzü. 'attr_accessible' **, ** istediğiniz ** niteliklerin toplu güncellenebilir olmasını sağlar; 'attr_protected' **, ** istemediğiniz niteliklerin güncellenebileceğini listeler. –

+0

Ancak, 'attr_accessible' ile, modelinize daha fazla özellik eklerseniz, bunları belirtmediğiniz sürece erişilebilir olma konusunda endişelenmenize gerek kalmaz; attr_protected' ile herhangi bir yeni özellik erişilebilir olacaktır. Tabii ki, doğru cevap hangisi olmasını beklediğinize bağlıdır (bazı insanlar herhangi bir sürpriz olmaması için ne yapmak istediğinizi açık bir şekilde listelemenin tercih edildiğini düşünürler). –

+0

@Daniel Vandersluis: Evet Bu doğru. Attr_accessible ile beyaz listeleme, attr_protected ile kara listeden çok daha iyi bir güvenlik stratejisidir. Ancak sorunun sorgulandığı yol, kara liste yaklaşımının tercih edildiğini ima etti. – EmFi

İlgili konular