2010-10-08 47 views
7

一些受歡迎的博客網站通常在其URL中使用方括號,但ruby的內置URI.parse()方法扼流圈會引發一個令人討厭的異常,如下所示: http://redmine.ruby-lang.org/issues/show/1466我如何monkey-patch 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_support/ core_ext/module/aliasing.rb:33:在alias_method:NameError:未定義模塊'URI'的方法'parse'

我該如何成功地修改URI-parse?

+0

紅寶石> = 1.9請參閱http://stackoverflow.com/questions/7637138/how-to-prevent-the-character-from-causing-a-bad-uri-error-in-ruby – 2015-02-10 09:15:58

回答

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

這會轉義一些額外的字符Ruby的URI類不批准of:url.gsub(/([{} | \^\ [\]'])/){| s | URI.escape(s)} – nil 2011-05-09 19:06:00

+0

@nil:'CGI.escape'工作; 'URI.escape'不會做你想要的。 – 2012-07-27 17:17:27

0

@nil他的評論是非常有幫助的,我們結束了以下內容:

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