Rails, arasındaki fark nedir
attr_accessor ve
attr_accessible? Anlayışımdan
attr_accessor Bu değişken için getter ve setter yöntemleri oluşturmak için kullanılır, böylece
Object.variable veya
Object.variable = some_value.
Bunu okudum
attr_accessible Bu spesifik değişkeni dış dünyaya erişilebilir kılar.
Birisi bana farkın ne olduğunu söyleyebilir mi
attr_accessor bir alıcı ve bir belirleyici yapan bir Ruby yöntemidir.
attr_accessible değerleri bir toplu atamaya geçirmenizi sağlayan bir Rails yöntemidir:
new(attrs) veya
update_attributes(attrs).
İşte bir kitle ödevi:
Order.new({ :type => 'Corn', :quantity => 6 })
Siparişin de bir indirim kodu olabileceğini düşünebilirsiniz
:price_off. Etiketlemezseniz
:price_off gibi
attr_accessible Kötü amaçlı kodun böyle yapmasını engellersiniz:
Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 })
Formunuz için bir alan olmasa bile
:price_offModelinizde varsa, varsayılan olarak kullanılabilir. Bu, hazırlanmış bir POST'un hala ayarlayabileceği anlamına gelir. kullanma
attr_accessible Beyaz kitle atanabilecek şeyleri listeler.
Bu konudaki ve google'daki pek çok kişi bunu çok iyi açıklıyor
attr_accessible Toplu olarak güncellenmesine izin verilen özelliklerin beyaz listesini belirtir (Bir nesne modelinin tüm özellikleri aynı anda birlikte)
Bu, uygulamanızı "Toplu görev" korsan istismarından korumak için çoğunlukla (ve sadece).
Bu, resmi Rails doc'da açıklanmaktadır: Kütle Atama
attr_accessor bir sınıfta setter ve getter yöntemleri oluşturmak için bir ruby kodudur. Bu kadar.
Şimdi, bir açıklama olarak eksik bir veritabanı tablosu ile bir (Rails) modeli arasında bir şekilde bir bağlantı oluşturduğunuzda, ASLA ASLA, ASLA, ASLA ihtiyacınız var.
attr_accessor Masanızın kayıtlarını değiştirebilmek için modelinizde ayarlayıcılar ve alıcılar oluşturun.
Bunun nedeni, modelinizin tüm yöntemleri
ActiveRecord::Base Temel CRUD girişlerini (Oluşturma, Okuma, Güncelleme, Silme) sizin için zaten tanımlayan Class.
Bu resmi belgede burada açıklanmıştır. Raylar Modeli ve burada Varsayılan erişimcinin üzerine yaz ("Varsayılan erişicinin üzerine yaz" bölümüne ilerleyin)
Şunu söyleyelim: üç sütun "firstname", "lastname" ve "role" içeren "users" adlı bir veritabanı tablomuz var:
SQL talimatları:
CREATE TABLE users (
firstname string,
lastname string
role string
);
Seçeneğini ayarladım
config.active_record.whitelist_attributes = true Uygulamanızı Mass atama istismarından korumak için config / environment / production.rb dosyasında. Bu burada açıklanmaktadır: Kütle Atama
Rails modeliniz aşağıdaki Modelle mükemmel bir şekilde çalışacaktır:
class User < ActiveRecord::Base
end
Ancak, formunuzun View for Work'ü çalıştırmak için kullanıcının her bir özelliğini denetleyicinizde ayrı ayrı güncellemeniz gerekir:
def update
@user = User.find_by_id(params[:id])
@user.firstname = params[:user][:firstname]
@user.lastname = params[:user][:lastname]
if @user.save
# Use of I18 internationalization t method for the flash message
flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
end
respond_with(@user)
end
Şimdi hayatınızı kolaylaştırmak için, Kullanıcı modeliniz için karmaşık bir kontrolör yapmak istemezsiniz.
Yani kullanacaksın
attr_accessible Sınıf modelinizde özel yöntem:
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
end
Yani güncellemek için "otoyol" (toplu atamayı) kullanabilirsiniz:
def update
@user = User.find_by_id(params[:id])
if @user.update_attributes(params[:user])
# Use of I18 internationlization t method for the flash message
flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
end
respond_with(@user)
end
"Rol" özelliklerini
attr_accessible Kullanıcıların rollerini kendi başlarına belirlemelerine izin vermediğiniz için liste (yönetici gibi). Bunu başka bir özel yönetici görünümünde yaparsınız.
Kullanıcı görünümünüz bir "rol" alanı göstermese de, bir korsan, parazit karmasında "rol" içeren bir HTTP POST isteğini kolayca gönderebilir. Eksik "rol" özelliği
attr_accessible uygulamanızı bundan korumaktır.
Yine de user.role özelliğinizi aşağıdaki gibi kendi başlarına değiştirebilir, ancak tüm özelliklerle birlikte değiştiremezsiniz.
@user.role = DEFAULT_ROLE
Neden cehennemdesin
attr_accessor?
Bu, kullanıcı formunuzun kullanıcı tablonuzda olmayan bir alanı bir sütun olarak göstermesi durumunda olacaktır.
Örneğin, kullanıcı görünümünüzün "lütfen-lütfen-admin-in-ben-in-here" alanını gösterdiğini varsayalım.
Bu bilgiyi masanızda saklamak istemezsiniz. Sadece Rails size bir "deli" ;-) kullanıcının abone olduğunu bildiren bir e-posta yollamasını istersiniz.
Bu bilgiyi kullanabilmek için geçici olarak bir yerde saklamanız gerekmektedir.
Bir daha kurtarmak ne daha kolay bir
user.peekaboo öznitelik
Yani bu alanı modelinize eklersiniz:
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
attr_accessor :peekaboo
end
Böylece eğitimli bir şekilde kullanabileceksiniz.
user.peekaboo Bir e-posta göndermek veya istediğiniz her şeyi yapmak için denetleyicinizde bir yere atıfta bulunun.
ActiveRecord, yaptığınız zaman "peekaboo" özelliğini masaüstünüzde kaydetmeyecektir.
user.save Çünkü modelinde bu adayla eşleşen herhangi bir sütun görmüyor.
attr_accessor aynı ada sahip bir örnek değişkenine setter ve getter yöntemleri veren bir Ruby yöntemidir. Yani eşdeğerdir
class MyModel
def my_variable
@my_variable
end
def my_variable=(value)
@my_variable = value
end
end
attr_accessible Bir kütle atamasında hangi değişkenlerin ayarlanabileceğini belirleyen bir Rails yöntemidir.
Bir form gönderdiğinizde ve benzeri bir şeyiniz varsa
MyModel.new params[:my_model] o zaman biraz daha fazla kontrol sahibi olmak istersiniz, böylece insanlar istemediğiniz şeyleri sunamazlar.
Yapabilirsin
attr_accessible :email Birisi hesabını güncellediğinde, e-posta adresini değiştirebilirler. Ama sen yapmazdın
attr_accessible :email, :salary çünkü o zaman bir kişi maaşlarını form tesliminden geçirebilir. Diğer bir deyişle, bir zam için yollarını kesebilirler.
Bu tür bilgilerin açık bir şekilde ele alınması gerekiyor. Sadece formdan kaldırmak yeterli değil. Birisi ateşböceği ile içeri girebilir ve elemanı bir maaş alanı göndermek için forma ekleyebilir. Denetleyici güncelleme yöntemine yeni bir maaş göndermek için yerleşik kıvrımı kullanabilirler, bir yazıyı bu bilgi ile gönderen bir komut dosyası oluşturabilirler.
Yani
attr_accessor değişkenleri saklamak için yöntemler oluşturmakla ilgilidir.
attr_accessible toplu görevlerin güvenliği hakkındadır.
attr_accessor Ruby kodudur ve veritabanınızda bir sütun yoksa, ancak formlarınızda bir alan göstermek istediğinizde kullanılır. Buna izin vermenin tek yolu
attr_accessor :fieldname ve bu alanı Görünümünüzde veya modelini, isterseniz, ancak çoğunlukla Görünümünüzde kullanabilirsiniz.
Aşağıdaki örneği ele alalım
class Address
attr_reader :street
attr_writer :street
def initialize
@street = ""
end
end
Burada kullandık
attr_reader (okunabilir özellik) ve
attr_writer (yazılabilir özellik) amaca ulaşmak için. Ancak aynı işlevi kullanarak elde edebiliriz
attr_accessor. Kısacası, attr_accessor hem getter hem de setter yöntemlerine erişim sağlar.
Değiştirilmiş kod aşağıdaki gibidir
class Address
attr_accessor :street
def initialize
@street = ""
end
end
attr_accessible Toplu Atama'ya izin vermek istediğiniz tüm sütunları listelemenize izin verir. Bunun tersi
attr_protected Bu alan anlamına gelen herkesin Mass Assign'a izin verilmesini istemiyorum. Muhtemelen veritabanınızda hiç kimsenin etrafta dolaşmasını istemediğiniz bir alan olacaktır. Bir durum alanı veya benzerleri gibi.
İki kelimeyle:
attr_accessor olduğu
getter,
setter yöntem.
buna karşılık
attr_accessible belirli bir özellik erişilebilir olduğunu ya da değil. bu kadar.
Kullanmalıyım eklemek isterdim Güçlü parametre yerine
attr_accessible kitle atadan korumak için.
Şerefe!
Hızlı ve özlü bir fark genel bakış:
attr_accessor okuma ve yazma erişimleri oluşturmak için kolay bir yoldur
Senin sınıfın. Veritabanınızda bir sütun olmadığında kullanılır.
ama hala formlarınızda bir alan göstermek istiyorum. Bu alan bir
“virtual attribute” Rails modelinde.
sanal özellik - Veritabanındaki bir sütuna karşılık gelen bir özellik.
attr_accessible erişilebilir niteliklerini tanımlamak için kullanılır
senin denetleyici yöntemleri tarafından bir özellik için kullanılabilir yapar
kitle ataması .. Sadece sizin özelliklerine erişime izin verir
gerisini belirtin, reddedin.