Anulación / modificación de la clase de Rails (ActiveResource)

He estado luchando con un problema con ActiveResource por un poco ahora: cuando un nombre de host se resuelve para una solicitud de ActiveResource, pero no hay un servidor en el otro extremo para devolver información, el valor de tiempo de espera de ActiveResource no funciona. La solicitud simplemente cuelga.

Después de revisar el código ActiveResource, me di cuenta de que esto se debe a que el objeto Net: Http subyacente solo tiene un valor de tiempo de espera establecido: read_timeout. La biblioteca Net: Http define esto como “Segundos a esperar hasta la lectura de un bloque (por una llamada de lectura (2))”. Net: Http lib también define otro valor de tiempo de espera, open_timeout, que se define como “Segundos a esperar hasta que se abra la conexión”.

No estoy seguro de por qué open_timeout no se establece de forma predeterminada con el valor de tiempo de espera establecido en una clase ActiveResource, pero después de modificar la clase ActiveResource :: Connection para incluir open_timeout en los objetos http, ¡mi problema se resolvió!

Soy nuevo en Rails, por lo que no estoy seguro de cuál es la mejor manera de realizar esta modificación en mi proyecto; No quiero simplemente cambiar el código en mi directorio de gems. ¿Hay una manera adecuada de hacer estas modificaciones en un proyecto de Rails? He visto que es posible cargar clases de Rails desde la carpeta / proveedor, pero ¿todos tienen que estar allí para que funcione? Comencé a crear subclases de las clases ActiveResource :: Base y ActiveResource :: Connection, pero parecía que tal vez existía una forma más fácil de hacerlo, ya que la función que crea la instancia Net: Http es privada … ¿alguna idea?

En primer lugar, este es un problema que debe informar al bugtracker de Rails: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/

Cuando tengo que hacer una revisión de cosas menores como estas, normalmente creo un archivo de inicializador en RAILS_ROOT / config / initializers y vuelvo a abrir la clase que bash corregir.

class ActiveResource::Base # your fix goes here end 

Esto se llama parche de monos y es algo controvertido. Pero personalmente considero que es bastante brutal introducir un nuevo nivel en la jerarquía de herencia que no tiene un significado semántico para mi código.