Soru Attr_accessor ve attr_accessible arasındaki fark


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


219
2018-06-28 21:52


Menşei


Sen haklısın attr_accessor getter ve setter yöntemleri üretmek için kullanılır. Oldukça kapsamlı bir açıklama için lütfen bir önceki soruya verdiğim cevabı gör attr_accessible: stackoverflow.com/questions/2652907/... Daha sonra başka bir ayrıntıya ihtiyacınız varsa, sorunuzu güncelleyin. - mikej
attr_accessible, korumalı_attributes gemini kullanmadığınız sürece Rails 4'te artık desteklenmiyor. stackoverflow.com/questions/17371334/... (Temmuz 2014) - emery


Cevaplar:


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.


251
2018-06-28 22:04



Neden olmasın attr_accessible Rails belgelerinde? api.rubyonrails.org - Chloe
Rails4'ün bir şeyler yapmak için yeni bir yolu var gibi görünüyor. Bu cevabı gör: stackoverflow.com/questions/17371334/... - Paul Rubel
Güçlü parametre kullanımının yerini aldığından attr_accessible  edgeguides.rubyonrails.org/... - Imran


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.


170
2017-10-17 16:21





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.


47
2018-06-28 22:07



Bir yazım hatası var, kod bloğundan sonra söylemeliyim attr_accesible - Chubas
Harika bir yazı, sınıf örneğini beğendim. Bir açıklama eklemek için ekstra (sahte) bonus puan :as! - Ian Vaughan
Model ActiveRecord :: Base tarafından genişletilmiştir. class User < ActiveRecord::Base - Green


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.


16
2017-08-17 06:12



Öyleyse, eğer bir göç alanında alanlar oluşturursam, onları attr_accessible kullanarak kullanılabilir hale getirirsem, bir alıcı ve ayarlayıcı oluşturmaya gerek olmadığını mı söylüyorsun? Ancak alan veritabanında değilse, nasıl olur attr_accessible bir getter / setter gibi davranmaz? Bir "has_secure_password" satırı eklerseniz, attr_accessible, getter / setter 'a izin vermek için yeterli olur: parola ve: password_confirmation veritabanında olmasalar bile. Çok karışık ;) - tentimes


İ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!


2
2018-02-18 11:12





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.


2
2018-03-31 06:30