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
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.
Raylar üzerinde Ruby _snowman, param i...
Raylar üzerinde Ruby Veritabanı için M...
C bir Sözlük üzerinde yineleme için en...
Tek örnek bir uygulama oluşturmak için...
Bir ağaca doğru düz bir masa ayrıştırm...