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

ste*_*eve 7 ruby monkeypatching ruby-on-rails

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


免责声明:

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

Car*_*and 9

只需在对象上定义一个方法:

class Thing
  def greeting
    'yo, man'
  end
end

Thing.instance_methods(false)
  #=> [:greeting]

object = Thing.new
  #=> #<Thing:0x007fc4ba276c90> 

object.greeting
  #=> "yo, man" 
Run Code Online (Sandbox Code Playgroud)

定义两个方法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>
Run Code Online (Sandbox Code Playgroud)

删除object单例方法greeting.

object.singleton_class.send(:remove_method, :greeting)

object.methods(false)
  #=> [:farewell] 
object.greeting
  #=> "yo, man"
Run Code Online (Sandbox Code Playgroud)

:greetingobject单例类中删除的另一种方法如下.

class << object
  remove_method(:greeting)
end
Run Code Online (Sandbox Code Playgroud)