我如何修补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?

alias_method_chain在模块级别执行,因此它只影响实例方法。

你要做的是在模块的类级别上执行它:

 require 'uri' module URI class << self def parse_with_safety(uri) parse_without_safety uri.gsub('[', '%5B').gsub(']', '%5D') end alias parse_without_safety parse alias parse parse_with_safety end end 

@nil他的评论非常有帮助,我们最终得到以下结论:

 def parse_with_safety(uri) begin parse_without_safety uri.gsub(/([{}|\^\[\]\@`])/) {|s| URI.escape(s)} rescue parse_without_safety '/' end end