单个对象上的猴子补丁方法

时间:2015-06-04 20:07:52

标签: ruby-on-rails ruby monkeypatching

我想在模型类的单个实例上覆盖update_attributes方法的行为。假设变量被称为@alert,最好的方法是什么?要清楚,我想要为整个类修改此方法的行为。

免责声明:

我需要这样做以强制方法在我需要时返回false,以便我可以为后面的错误处理代码编写单元测试。我知道这可能不是最好的做法。

2 个答案:

答案 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