Как мне сделать метод URI.parse?
Некоторые популярные сайты блогов обычно используют квадратные скобки в своих 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: неопределенный метод 'parse' для модуля 'URI'
Как я могу успешно обезьяна-патч URI.parse?
2 ответа
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
@nil его комментарий очень полезен, мы получили следующее:
def parse_with_safety(uri)
begin
parse_without_safety uri.gsub(/([{}|\^\[\]\@`])/) {|s| URI.escape(s)}
rescue
parse_without_safety '/'
end
end