我想在模型类的单个实例上覆盖update_attributes
方法的行为。假设变量被称为@alert
,最好的方法是什么?要清楚,我不想要为整个类修改此方法的行为。
免责声明:
我需要这样做以强制方法在我需要时返回false
,以便我可以为后面的错误处理代码编写单元测试。我知道这可能不是最好的做法。
答案 0 :(得分:8)
只需在对象上定义一个方法:
GraphicsWindow.BrushColor = "darkgray"
Textboxlocked = Controls.AddTextBox(20,20)
Controls.HideControl(Textboxlocked)
GraphicsWindow.BrushColor = "black"
Textbox = Controls.AddTextBox(20,20)
Controls.SetTextBoxText(Textbox,"Hello World")
lock = Controls.AddButton("Lock",20,50)
unlock = Controls.AddButton("Unlock", 130,50)
Controls.ButtonClicked = onButtonClick
Timer.Interval = 10
Timer.Tick = whenTickTocks
Sub whenTickTocks
If editable = "False" then
Controls.SetTextBoxText(Textboxlocked,holdtext)
EndIf
endsub
Sub onButtonClick
If Controls.LastClickedButton = lock Then
editable = "False"
holdtext = Controls.GetTextBoxText(Textbox)
Controls.SetTextBoxText(Textboxlocked,holdtext)
Controls.ShowControl(Textboxlocked)
Controls.HideControl(Textbox)
Else
editable = "True"
Controls.ShowControl(Textbox)
Controls.HideControl(Textboxlocked)
EndIf
EndSub
在class Thing
def greeting
'yo, man'
end
end
Thing.instance_methods(false)
#=> [:greeting]
object = Thing.new
#=> #<Thing:0x007fc4ba276c90>
object.greeting
#=> "yo, man"
上定义两个方法(这将是object
的单例类中的实例方法。
object
删除def object.greeting
'hey, dude'
end
def object.farewell
'see ya'
end
object.methods(false)
#=> [:greeting, :farewell]
object.singleton_class.instance_methods(false) #=> [:greeting, :farewell]
object.greeting
#=> "hey, dude"
object.farewell
#=> "see ya"
new_obj = Thing.new
new_obj.greeting
#=> "yo, man"
new_obj.farewell
#NoMethodError: undefined method `farewell' for #<Thing:0x007fe5a406f590>
的单例方法object
。
greeting
从object.singleton_class.send(:remove_method, :greeting)
object.methods(false)
#=> [:farewell]
object.greeting
#=> "yo, man"
的单例类中删除:greeting
的另一种方法如下:
object
答案 1 :(得分:1)
创建对象后,调用&#34; define_method&#34;在它上面:
object = Thing.new
object.define_method("update_attributes") { return false }
完成后,object.update_attributes
现在应该返回false