Tag: monkeypatching

如何在Rails中自动加载猴子补丁代码?

我正在修补一个Rails引擎,例如: SomeClass.class_eval do # … end 我第一次访问网站时,至少在开发模式下,它可以工作,但第二次就像我的补丁从未存在过。 我认为它是Rails自动重新加载引擎(安装在vendor /中)而不是重新加载我的代码。 这是Rails 2.3。 任何想法如何做到这样我的代码也被重新加载?

在Object中的模块中混合会导致所有对象将该模块的实例方法作为单例方法inheritance

当我尝试将自己的行为添加到Object类时,我会得到在将模块混合到用户定义的类时不会发生的不良影响。 module Entity def some_instance_method puts ‘foo’ end def self.secret_class_method puts ‘secret’ end module ClassMethods def some_class_method puts ‘bar’ end end def self.included( other_mod ) other_mod.extend( ClassMethods ) end end 现在,我创建类Bob ,使其包含Entity 。 class Bob; include Entity; end; 这产生了期望和预期的输出: Bob.secret_class_method #=> NoMethodError Bob.some_instance_method #=> NoMethodError Bob.some_class_method #=> bar Bob.new.secret_class_method #=> NoMethodError Bob.new.some_instance_method #=> foo Bob.new.some_class_method […]

我如何修补ruby的URI.parse方法

一些流行的博客网站通常在其url中使用方括号,但是ruby的内置URI.parse()方法会对它们产生影响,引发一个令人讨厌的exception,如: http ://redmine.ruby-lang.org/issues/show/ 1466 我正在尝试编写一个简单的猴子补丁,它使用方括号优雅地处理URL。 以下是我到目前为止的情况: require ‘uri’ module URI def self.parse_with_safety(uri) safe_uri = uri.replace(‘[‘, ‘%5B’) safe_uri = safe_uri.replace(‘]’, ‘%5D’) URI.parse_without_safety(safe_uri) end alias_method_chain :parse, :safety end 但是在运行时会产生错误: /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/core_ext/module/aliasing.rb:33:in alias_method:NameError:模块’URI’的未定义方法’解析’ 我怎样才能成功修补URI.parse?

在Rails中向Integer类添加方法的最佳位置在哪里?

在Rails中向整数类添加方法的最佳位置在哪里? 我想添加一个to_meters和to_miles方法。

猴子补丁vs class_eval?

class String def hello “world” end end String.class_eval { def world “hello” end } “a”.world => “hello” “b”.hello => “world” 他们似乎做了同样的事情 – 向现有类添加方法。 那有什么区别?

猴子修补。 SOLID原则?

在一些个人项目中,我正在慢慢地从PHP5转向Python,我现在很喜欢这种体验。 在选择沿着Python路线前,我看了Ruby。 我从ruby社区注意到的是,猴子修补既常见又备受推崇。 我也遇到了很多关于调试ruby s / w的试验的恐怖故事,因为有人包括一个相对无害的库来完成一些工作但是修补了一些使用频繁的核心对象而没有告诉任何人。 我选择Python(除了其他原因)之外它的语法更清晰,而且它可以完成Ruby所能做的一切。 Python正在使OO点击比PHP有更好的点击,我正在越来越多地阅读OO原则以增强这种更好的理解。 今晚我一直在阅读Robert Martin的SOLID原则: 单一责任原则, O pen / closed原则, L iskov替代原则, 我接口隔离原则,和 依赖倒置原理 我目前接受O : 软件实体(课程,模块,function等)应该开放扩展,但是要求修改 。 我的头脑是在确保OO设计的一致性和整个猴子修补之间的冲突。 我知道可以在Python中进行猴子修补。 我也明白,“pythonic”是遵循常见的,经过良好测试的oop最佳实践和原则。 我想知道的是社区对两个对立主题的看法; 他们如何互操作,当它最好地使用它时,是否应该完成猴子修补……希望你能为我提供解决方案。

猴子修补ruby中的类的推荐方法

我注意到有两种常见的方法来修补ruby中的类: 在类上定义新成员,如下所示: class Array def new_method #do stuff end end 并在类对象上调用class_eval: Array.class_eval do def new_method #do stuff end end 我想知道两者之间是否存在任何差异以及使用一种方法相对于另一种方法是否有优势?

修补Ruby的基类是否可以接受,例如Fixnum?

我仍然是Ruby的新手(阅读Pickaxe并将大部分时间花在irb ),现在我知道可以在Ruby中修补类,我想知道什么时候这样做是可以接受的,特别是它是否可以接受修补Ruby的基类。 例如:我在这里回答了另一个Ruby问题,海报想知道如何从DateTime减去小时数。 由于DateTime类似乎没有提供此function,我发布了一个答案,将DateTime和Fixnum类修补为可能的解决方案。 这是我提交的代码: require ‘date’ # A placeholder class for holding a set number of hours. # Used so we can know when to change the behavior # of DateTime#-() by recognizing when hours are explicitly passed in. class Hours attr_reader :value def initialize(value) @value = value end end # Patch the #-() […]

“猴子补丁”真的那么糟糕吗?

像Ruby和JavaScript这样的语言有开放类,允许你修改偶数核心类的接口,如数字,字符串,数组等。显然,这样做可能会使熟悉API的其他人感到困惑,但是有充分的理由要避免使用它们。 ,假设您正在添加到界面而不是更改现有行为? 例如,将一个Array.map实现添加到未实现ECMAScript第5版的Web浏览器(如果您不需要所有jQuery)可能会很好。 或者你的Ruby数组可能会受益于使用“inject”的“sum”方便方法。 只要更改被隔离到您的系统(例如,不是您发布用于分发的软件包的一部分),是否有充分的理由不利用此语言function?

猴子修补Devise(或任何Rails gem)

我在我的Rails项目中使用Devise身份validationgem,我想更改它在闪存警报中使用的密钥。 (设计使用:通知和:警告闪存键,但我想将它们更改为:成功和:错误,以便我可以使用Bootstrap显示漂亮的绿色/红色框。) 所以我希望能够以某种方式覆盖set_flash_message中的set_flash_message方法。 这是新方法: def set_flash_message(key, kind, options = {}) if key == ‘alert’ key = ‘error’ elsif key == ‘notice’ key = ‘success’ end message = find_message(kind, options) flash[key] = message if message.present? end 但我只是不知道该把它放在哪里。 更新: 基于答案,我使用以下代码创建了config / initializers / overrides.rb文件: class DeviseController def set_flash_message(key, kind, options = {}) if key == ‘alert’ key […]