ruby-on-rails - 单个对象上的猴子补丁方法

标签 ruby-on-rails ruby monkeypatching

我想在模型类的单个 实例上覆盖update_attributes 方法的行为。假设变量名为 @alert 最好的方法是什么?明确地说,我不想为整个类修改此方法的行为。


免责声明:

我需要执行此操作以强制该方法在我需要时返回 false,以便我可以为下面的错误处理代码编写单元测试。我知道这可能不是最佳做法。

最佳答案

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

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"

object 的单例类中删除 :greeting 的另一种方法如下。

class << object
  remove_method(:greeting)
end

关于ruby-on-rails - 单个对象上的猴子补丁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30653187/

相关文章:

Ruby 阶乘代码运行速度太慢

sql-server - sqlserver rake db 连接错误 :migrate

ruby - 如何要求用户输入并存储输入然后显示

ruby-on-rails - 如何在 Rails 中打开 URL?

ruby-on-rails - rake db :seed, 预填充数据库时出错。未初始化的常量 Clients_courses

javascript - Rails 3 中的 Ajax 页面加载正在破坏其他 JavaScript 功能..?

python - 使用元类替代类定义?

javascript - 如何检查默认的JS对象是否被修改?

python - CherryPy、多处理和 Gevent 猴子修补

ruby-on-rails - 在 Rails 中将多个输入字段作为列表而不是单独的名称发布。