一些流行的博客网站通常在其网址中使用方括号,但ruby的内置URI.parse()方法会对它们产生阻碍,引发一个令人讨厌的异常,如下所示: 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'的未定义方法'解析'< / p>
如何成功修补URI.parse?
答案 0 :(得分:12)
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
答案 1 :(得分:0)
@nil他的评论非常有帮助,我们最终得到以下结论:
def parse_with_safety(uri)
begin
parse_without_safety uri.gsub(/([{}|\^\[\]\@`])/) {|s| URI.escape(s)}
rescue
parse_without_safety '/'
end
end