7

一部の人気のあるブログサイトは通常、URLに角かっこを使用しますが、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:undefined method'parse' for module'URI'

URI.parseを正常にモンキーパッチするにはどうすればよいですか?

4

2 に答える 2

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
于 2010-10-08T14:19:07.003 に答える
0

@nil彼のコメントは非常に役に立ち、最終的には次のようになりました。

def parse_with_safety(uri)
  begin
    parse_without_safety uri.gsub(/([{}|\^\[\]\@`])/) {|s| URI.escape(s)}
  rescue
    parse_without_safety '/'
  end
end
于 2012-10-23T15:28:08.917 に答える