Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用monkey patch ruby';s URI.parse方法_Ruby_Uri_Monkeypatching - Fatal编程技术网

如何使用monkey patch ruby';s URI.parse方法

如何使用monkey patch ruby';s URI.parse方法,ruby,uri,monkeypatching,Ruby,Uri,Monkeypatching,一些流行的博客网站通常在URL中使用方括号,但ruby的内置URI.parse()方法阻塞了它们,引发了一个严重的异常,如下所示: 我正在尝试编写一个简单的猴子补丁,它优雅地处理带有方括号的URL。以下是我目前掌握的情况: require 'uri' module URI def self.parse_with_safety(uri) safe_uri = uri.replace('[', '%5B') safe_uri = safe_uri.rep

一些流行的博客网站通常在URL中使用方括号,但ruby的内置URI.parse()方法阻塞了它们,引发了一个严重的异常,如下所示:

我正在尝试编写一个简单的猴子补丁,它优雅地处理带有方括号的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\u support/core\u ext/module/aliasing.rb:33:在别名中\u方法:name错误:模块“URI”的未定义方法“parse”


如何成功地生成修补程序URI.parse?

别名\u方法\u链在模块级别执行,因此它只影响实例方法

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

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
require'uri'
模块URI

class@nil他的评论很有帮助,我们得出以下结论:

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

这将转义Ruby的URI类不赞成的一些附加字符:url.gsub(/([{}}\^[]`])/){{s|URI.escape(s)}@nil:
CGI.escape
works
URI.escape
不符合您的要求。有关Ruby>=1.9的信息,请参阅