Как мне сделать метод URI.parse? - PullRequest
       22

Как мне сделать метод URI.parse?

7 голосов
/ 08 октября 2010

Некоторые популярные сайты блогов обычно используют квадратные скобки в своих URL, но встроенный в ruby ​​метод URI.parse () блокирует их, вызывая неприятное исключение, согласно: http://redmine.ruby -lang.org / вопросы / показать / 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

Но при запуске выдается ошибка:

/ Библиотека / Ruby / Gems / 1.8 / gems / activesupport-2.3.8 / lib / active_support / core_ext / module / aliasing.rb: 33: в alias_method: NameError: неопределенный метод 'parse' для модуля 'URI'

Как я могу успешно обезьяна-патч URI.parse?

Ответы [ 2 ]

12 голосов
/ 08 октября 2010

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
0 голосов
/ 23 октября 2012

@ nil его комментарий очень полезен, мы получили следующее:

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