SORU
5 Mayıs 2012, CUMARTESİ


Raylar üzerinde Ruby belirleyici bir yöntemi geçersiz kılmak için doğru yolu nedir?

Ben kullanarak Ruby on Rails 3.2.2 ve ben gibi ise şudur Bir "doğru"/"doğru"/"emin" yol geçersiz kılmak için bir ayarlayıcı yöntemi için bir Sınıf özniteliği.

attr_accessible :attribute_name

def attribute_name=(value)
  ... # Some custom operation.

  self[:attribute_name] = value
end

Yukarıdaki kod beklendiği gibi çalışmıyor. AncakBen gibi, kullanarak yukarıdaki kodu, gelecekte olacak sorunları veya, en azından, ne sorunları "umuyorum ki"/"olabilir" ile Ruby on Rails. Eğer bu belirleyici bir yöntemi geçersiz kılmak için doğru yol değil eğer doğru değilse, doğru yolu nedir?


Not: Kod kullanırsam

attr_accessible :attribute_name

def attribute_name=(value)
  ... # Some custom operation.

  self.attribute_name = value
end

Aşağıdaki hatayı alıyorum:

SystemStackError (stack level too deep):
  actionpack (3.2.2) lib/action_dispatch/middleware/reloader.rb:70

CEVAP
5 Mayıs 2012, CUMARTESİ


Eğer modeller yoluyla erişirken bir tablo sütunları için ayarlayıcı yöntemleri geçersiz kılmak istiyorsanız, bu bunu yapmak için bir yoldur.

class Model < ActiveRecord::Base
  attr_accessible :attribute_name

  def attribute_name=(value)
    # custom actions
    ###
    write_attribute(:attribute_name, value)
    # this is same as self[:attribute_name] = value
  end

end

Raylar belgelerinde Overriding default accessors bkz.

Bu yüzden, ilk yöntem, Raylar üzerinde Yakut Modelleri sütun ayarlayıcıları geçersiz kılmak için doğru yoldur. Bu set zaten Raylar tarafından model öznitelikleri olarak tablonun sütun erişim sağlanır. Bu ActiveRecord ORM haritalama diyoruz.

Ayrıca akılda tutmakModel üstünde attr_accessible set ile bir ilgisi yok.Tamamen farklı bir functionlity (this question) vardır

Ama saf Ruby, eğer bir sınıf için set tanımlanan ve pasör geçersiz kılmak istiyorsanız, bu gibi örnek değişkeni kullanmak için:

class Person
  attr_accessor :name
end

class NewPerson < Person
  def name=(value)
    # do something
    @name = value
  end
end

Bu daha kolay attr_accessor ne yaptığını biliyorsun bir zamanlar anlamak olacaktır. Kodu attr_accessor :name Bu iki yöntem () alıcı ve ayarlayıcı eşdeğerdir

def name # getter
  @name
end

def name=(value) #  setter
  @name = value
end

Ayrıca İkinci yöntem attribute_name= Bu yöntem içinde aynı yöntem aradığınız sonsuz bir döngüye neden olacak, çünkü başarısız olur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • disneychannel

    disneychanne

    19 ŞUBAT 2006
  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006
  • TecNoob

    TecNoob

    15 AĞUSTOS 2013