Bu iş parçacığı ve Google'daki birçok kişi, attr_accessible
toplu olarak güncellenmesine izin verilen özelliklerin bir beyaz listesini (bir nesne modelinin tüm özellikleri aynı anda bir arada) belirten çok iyi açıklıyor ) Bu, uygulamanızı korumak için temel olarak (ve yalnızca) "Toplu görev" korsan sömürüsünden.
Bu, burada resmi Rails belgesinde açıklanmıştır: Toplu Atama
attr_accessor
bir Sınıfta ayarlayıcı ve alıcı yöntemleri (hızlı bir şekilde) oluşturmak için bir yakut koddur. Bu kadar.
Şimdi, açıklama olarak eksik olan şey, bir veritabanı tablosuyla bir (Rails) modeli arasında bir şekilde bir bağlantı oluşturduğunuzda, ASLA, ASLA, ASLA ihtiyacınız yoktur. attr_accessor
, modelinizde değişiklik yapabilmek için seterler ve alıcılar oluşturmak için . tablonun kayıtları.
Bunun nedeni, modelinizin sizin için ActiveRecord::Base
temel CRUD erişimcilerini (Oluşturma, Okuma, Güncelleme, Silme) zaten tanımlayan tüm yöntemleri Sınıftan devralmasıdır. Bu resmi doc burada açıklanmıştır Raylar Modeli burada ve varsayılan erişimci üzerine yazma (bölüm "Üzerine Yaz varsayılan erişimci" na inin)
Örneğin şunu söyleyin: "firstname", "lastname" ve "role" sütunlarından oluşan "users" adlı bir veritabanı tablonuz var:
SQL talimatları:
CREATE TABLE users (
firstname string,
lastname string
role string
);
config.active_record.whitelist_attributes = true
Uygulamanızı Toplu atama istismarından korumak için config / environment / production.rb dosyasındaki seçeneği ayarladığınızı varsaydım . Bu burada açıklanmaktadır: Toplu Atama
Rails modeliniz aşağıdaki Model ile mükemmel şekilde çalışacaktır:
class User < ActiveRecord::Base
end
Ancak, formunuzun Görünümünün çalışması için her bir kullanıcı özelliğini denetleyicinizde ayrı olarak 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
Artık hayatınızı kolaylaştırmak için Kullanıcı modeliniz için karmaşık bir denetleyici yapmak istemezsiniz. attr_accessible
Sınıf modelinizde özel yöntemi kullanacaksınız :
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
end
Böylece güncellemek için "otoyol" (toplu atama) 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
listeye çünkü kullanıcılarınızın rollerini kendileri (yönetici gibi) belirlemelerine izin vermezsiniz. Bunu başka bir özel Yönetici Görünümünde kendiniz yaparsınız.
Kullanıcı görünümünüzde bir "rol" alanı görünmese de, bir korsan params karmasına "rol" içeren bir HTTP POST isteği gönderebilir. Üzerindeki eksik "rol" özelliğiattr_accessible
uygulamanızı bundan korumaktır.
Yine de user.role özniteliğinizi aşağıdaki gibi kendi başınıza değiştirebilirsiniz, ancak tüm özniteliklerle birlikte değiştiremezsiniz.
@user.role = DEFAULT_ROLE
Neden cehennemi kullanıyorsun attr_accessor
?
Bu, kullanıcı formunuzun, kullanıcılar tablonuzda bir sütun olarak bulunmayan bir alanı göstermesi durumunda olur.
Örneğin, kullanıcı görünümünüzün "burada olduğumuzu lütfen söyleyin" alanını gösterdiğini varsayalım. Bu bilgileri masanızda saklamak istemezsiniz. Sadece Rails size bir "çılgın" ;-) kullanıcı abone olduğunu size bir e-posta göndermek istiyorum.
Bu bilgileri kullanabilmek için geçici olarak bir yerde saklamanız gerekir. Bir user.peekaboo
özellikte kurtarmaktan daha kolay ne olabilir ?
Böylece bu alanı modelinize eklersiniz:
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
attr_accessor :peekaboo
end
Böylece user.peekaboo
, e-posta göndermek veya istediğinizi yapmak için kumandanızdaki bir yerde bu özelliği eğitimli bir şekilde kullanabilirsiniz .
ActiveRecord, user.save
modelinde bu adla eşleşen hiçbir sütun görmediğinden , yaptığınızda "peekaboo" özniteliğini tablonuza kaydetmez .
attr_accessor
Getter ve setter yöntemleri oluşturmak için kullanılan haklısınız . Oldukça kapsamlı bir açıklama için lütfen bir önceki soruya verdiğim cevaba bakınattr_accessible
: stackoverflow.com/questions/2652907/… daha sonra başka spesifik ayrıntılara ihtiyacınız varsa sorunuzu güncelleyin.