我們有兩個Rails模型:Person
和Administrator
。我們在模型級別不允許拆除Administrator
S:重新定義調用超類方法的實例上的單個方法
class Person < ActiveRecord::Base
end
class Administrator < Person
def destroy
raise "Can't remove administrators."
end
end
me = Administrator.new
me.destroy # raises an exception
我希望能夠在測試過程中解決這個問題,但僅限於建立和拆除過程中產生的具體實例。我不想改變班級的行爲,所以class_eval
和remove_method
不可行。
我試圖重新定義實際實例的方法#destroy
:
def me.destroy
super
end
或重新定義它的單例類:
class << me
def destroy
super
end
end
但那些仍然拋出的異常。我無法弄清楚如何讓它隱式調用超類方法。我結束了創建我自己的destroy!
方法(因爲這實際上是不是ActiveRecord的方法),這有點違揹我的願望不會改變類的行爲:
def destroy!
ActiveRecord::Persistence.instance_method(:destroy).bind(self).call
end
有沒有什麼簡單的方法來告訴單實例方法來調用它的超類方法?
最終的答案:基於文章霍爾格就掛,我可以簡單地顯式調用父類方法:
def me.destroy
self.class.superclass.instance_method(:destroy).bind(self).call
end
謝謝,Holger。你的建議很好,但我主要好奇爲什麼我的'super'調用不能調用超類方法。你有什麼想法爲什麼會發生? – Brandan 2012-03-25 15:37:41
使用你的構造,你在'me'實例的單例類(也稱爲特徵類)上創建了重寫的destroy方法。如果你在該方法的範圍內,超級鏈如下:eigenclass - > class - >包含在類中的模塊 - >父類...這意味着你的'destroy'方法在你的'destroy'方法上'me'在你的'Aministrator'類上調用'destroy'方法。有關本徵類概念的更多信息,請參見[本文](http://blog.madebydna.com/all/code/2011/06/24/eigenclasses-demystified.html)。 – 2012-03-25 16:03:29
非常好!那篇文章爲我清除了它。 – Brandan 2012-03-26 13:39:11