2011-05-10 10 views
7

Estoy tratando de hacer un parche en una línea en la clase Net en la biblioteca estándar. He creado un archivo llamado patches.rb en la carpeta lib del proyecto y añadidos este¿Cómo monopatch Ruby correctamente?

module Net 
    class HTTP < Protocol 
    module HTTPHeader 
     def initialize_http_header(initheader) 
     @header = {} 
     return unless initheader 
     initheader.each do |key, value| 
      @header[key.downcase] = [value.strip] rescue "" 
     end 
     end 
    end 
    end 
end 

Pero no funciona. ¿Lo estoy haciendo bien? (Eso es exactamente igual a la jerarquía de herencia.)

Edición: parte del problema fue que tuve que poner el archivo en la carpeta de initalizers. Pero sigue viendo el mismo error.

+1

estás haciendo entonces necesita ' 'lib/patches''? –

+0

@caley Pensé que todo en la carpeta lib se cargó automáticamente en el arranque. – picardo

+0

Lo siento, es que, pensé que te referías a una carpeta lib de tu creación. –

Respuesta

10

Como las cosas en el directorio lib/ solo se cargan a pedido, puede tener más éxito al poner parches como este en config/initializers/ donde se cargan automáticamente después de que la pila se haya inicializado.

También puede colapsar la definición de extensiones a algo como esto:

module Net::HTTP::HTTPHeader 
    # ... (redefined methods) ... 
end 
+0

Gracias, tadman. Colapsé la definición, pero el código ejecutado aún parece provenir del origen del código. – picardo

+3

Puede ser fácil hacer el parche incorrecto, por lo que siempre debe verificar el espacio de nombre de su objetivo. Eché un vistazo a 'net/http.rb' y probablemente debería ser' Net :: HTTPHeader' en el que está redefiniendo los métodos, no 'Net :: HTTP :: HTTPHeader'. – tadman

Cuestiones relacionadas