Как правильно изменить / создать подкласс RestClient :: Response - PullRequest
3 голосов
/ 24 марта 2011

Я пишу Ruby-интерфейс для Fluidinfo , используя в качестве основы rest-client gem. Мне очень нравится, как вызовы RestClient автоматически возвращают тело, если вы не вызываете код / ​​заголовки / и т.д. метод, и я хотел бы сохранить эту функциональность. Проблема в том, что я хочу, чтобы JSON, который Fluidinfo возвращал, был предварительно проанализирован, поэтому пользователям не нужно беспокоиться об этом. Меня это не очень волнует, за исключением того, что в некоторых случаях Fluidinfo будет возвращать значение типа "foo", что технически не является JSON, поэтому базовый гем JSON не будет его анализировать. Вместо этого я использую YAJL, который принимает эти примитивные значения.

Я очень новичок в Ruby (в основном знаком с Python и Perl), поэтому я не совсем уверен, как это сделать. Могу ли я просто создать подкласс RestClient::Response и переопределить метод create? Я знаю, что в Ruby вы можете открывать классы и переопределять методы, но я не уверен, что это хорошая идея в этом случае.

Любой совет будет оценен.

1 Ответ

1 голос
/ 17 августа 2011

Переопределение метода create для RestClient::Response нарушило бы его первоначальную функциональность для rest-client, используемого бок о бок с вашим интерфейсом.Поскольку гем rest-client является часто используемым гемом, он не может быть тем, что вы хотели.

В такой ситуации я пишу класс-обертку, имеющий экземпляр исходного, пишу методы псевдонимов для вызова наисходный экземпляр и переопределите необходимые методы.

Псевдонимы могут быть немного короткими, используя общий метод request, который делает send для исходного экземпляра;тогда псевдонимы только вызывают request :method_name, *args.

Таким образом, я обернул rest-client, чтобы он работал как простой пользовательский агент, хранящий файлы cookie, и переопределил глобальную переменную класса RestClient.proxy перед каждым запросом.Мне нужен был и rest-client, и couchrest (couchrest, использующий сам rest-client), где я сам хотел делать запросы rest-client через прокси-сервер и делать прямые запросы от couchrest, которые мне тоже пришлось обернуть.

Я знаю, что это не изящное решение, но по своему опыту в рубине меньше года я не знаю лучшего.Возможно, кто-то покажет нам лучший вариант, я бы тоже хотел его прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...