2010-10-08 10 views
7

Alcuni siti di blog popolari usano solitamente parentesi quadre nei loro URL ma il metodo URI.parse() di Ruby si strozza su di essi, sollevando una brutta eccezione, come da: http://redmine.ruby-lang.org/issues/show/1466Come utilizzare il metodo URI.parse di scimmia ruby ​​

Sto provando a scrivere una semplice patch di scimmia che gestisce con grazia gli URL con la parentesi quadra. Il seguente è quello che ho finora:

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 

Ma quando andare, questo genera un errore:

/Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/ core_ext/module/aliasing.rb: 33: in alias_method: NameError: metodo undefined 'parse' per il modulo 'URI'

Come posso eseguire correttamente la patch della scimmia URI.parse?

+0

per Ruby> = 1.9 vedere http://stackoverflow.com/questions/7637138/how-to-prevent-the-character-from-causing-a-bad-uri-error-in-ruby –

risposta

12

alias_method_chain viene eseguito a livello di modulo in modo che influenzi solo i metodi di istanza.

Quello che devi fare è eseguirlo sul livello di classe del modulo:

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

Questo eviterà alcuni caratteri aggiuntivi La classe URI di Ruby disapprova di: url.gsub (/ ([{} | \^\ [\] ']) /) {| s | URI.escape (s)} – nil

+0

@nil: 'CGI.escape' funziona; 'URI.escape' non fa quello che intendi. –

0

@nil il suo commento è molto utile, ci siamo ritrovati con il seguente:

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