2009-07-24 2 views
1

Я немного борюсь с проблемой с ActiveResource: когда имя хоста разрешено для запроса ActiveResource, но на другом конце нет сервера для возврата информации, значение таймаута ActiveResource не работает. Запрос просто зависает.Переопределение/изменение класса Rails (ActiveResource)

После просмотра кода ActiveResource я понял, что это связано с тем, что базовый объект Net: Http имеет только одно значение времени ожидания: read_timeout. Библиотека Net: Http определяет это как «Секунды ожидания до считывания одного блока (одним вызовом чтения (2)»). Net: Http lib также определяет другое значение тайм-аута open_timeout, которое определяется как «Секунды ожидания до открытия соединения».

Я не уверен, почему open_timeout не задано по умолчанию с значением таймаута, установленным в классе ActiveResource, но после изменения класса ActiveResource :: Connection для включения open_timeout в объекты http, моя проблема была решена!

Я новичок в рельсах, поэтому я не знаю, как наилучшим образом осуществить эту модификацию в моем проекте; Я не хочу просто менять код в моей директории gem. Есть ли способ сделать эти изменения в проекте рельсов? Я видел, что можно загружать классы рельсов из папки/vendor, но все ли они должны быть там, чтобы они работали? Я начал создавать подклассы классов ActiveResource :: Base и ActiveResource :: Connection, но казалось, что, возможно, был более простой способ сделать это, поскольку функция, которая создает экземпляр Net: Http, является частной ... любыми мыслями?

ответ

3

Прежде всего, это вопрос, вы должны сообщить Rails' багтрекере: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/

Когда я должен исправление незначительных вещей, как это, я обычно создаю файл инициализации в RAILS_ROOT/Config/инициализаторах и открыть класс, который я намерен исправить.

class ActiveResource::Base 
    # your fix goes here 
end 

Это называется патчем обезьяны и является несколько спорным. Но лично я считаю довольно грубым ввести новый уровень в иерархию наследования, который не имеет семантического значения для моего кода.

+0

Спасибо за помощь - это именно то, что я хотел! – Ben

+0

По пути - Мне любопытно, почему именно это работает? Метод, который я переопределяю в классе инициализаторов, является частным методом в классе ActiveResource :: Connection, и, тем не менее, это похоже на проблему с w/out? Я не могу найти мало информации о том, как файлы в папке инициализатора влияют на основные классы рельсов. – Ben

+0

файлы инициализатора никоим образом не являются особенными. Их содержимое просто запускается после загрузки среды. В Ruby ничто не мешает вам снова открыть класс и поиграть с частями. Видимость методов - довольно поверхностная концепция в Ruby. Например, вы можете вызвать частный метод для объекта с obj.send (: private_method, ...) – flitzwald

 Смежные вопросы

  • Нет связанных вопросов^_^