Ответы Active Resource, как их получить

У меня есть активный ресурс, который я запрашиваю для данных. Он возвращает записи, подсчеты, все, что я прошу.

например: продукт = Product.find(123)

Заголовки ответов предположительно содержат настраиваемый атрибут, например «HTTP_PRODUCT_COUNT=20», и я хотел бы изучить ответ.

Что было бы наиболее эффективным способом сделать это из IRB? У меня нет такой роскоши, как Rails или другие фреймворки, которые могли бы обеспечить базовый ответ.

Нужно ли мне взломать Net::HTTP или сам ActiveResource с помощью вызова с исправлением обезьяны или чего-то еще?


person David Lazar    schedule 12.05.2011    source источник
comment
Я разработал гем специально для таких нужд github.com/Fivell/activeresource-response   -  person Fivell    schedule 16.02.2012


Ответы (2)


Вот один из способов сделать это без использования обезьяньих патчей.

class MyConn < ActiveResource::Connection
  attr_reader :last_resp
  def handle_response(resp)
    @last_resp=resp
    super
  end
end

class Item < ActiveResource::Base
  class << self
    attr_writer :connection
  end
  self.site = 'http://yoursite'
end

# Set up our own connection
myconn = MyConn.new Item.connection.site
Item.connection = myconn  # replace with our enhanced version
item = Item.find(123)
# you can also access myconn via Item.connection, since we've assigned it
myconn.last_resp.code  # response code
myconn.last_resp.to_hash  # header

Если вы измените определенные поля класса, такие как сайт, ARes переназначит поле подключения с новым объектом Connection. Чтобы узнать, когда это произойдет, выполните поиск в файле active_resource/base.rb, где @connection имеет значение nil. В этих случаях вам придется снова назначить соединение.

ОБНОВЛЕНИЕ: Вот модифицированный MyConn, который должен быть потокобезопасным. (отредактировано с предложением Fivell)

class MyConn < ActiveResource::Connection
  def handle_response(resp)
    # Store in thread (thanks fivell for the tip).
    # Use a symbol to avoid generating multiple string instances.
    Thread.current[:active_resource_connection_last_response] = resp
    super
  end
  # this is only a convenience method. You can access this directly from the current thread.
  def last_resp
    Thread.current[:active_resource_connection_last_response]
  end
end
person Kelvin    schedule 19.07.2011
comment
если изменить @last_resps[Thread.current] = resp на Thread.current[active_resource_connection_last_response] = resp, то мне не нужны методы purge_last_resps, не так ли?? - person Fivell; 26.12.2011
comment
Fivell: Это отличная идея; Я должен был подумать об этом. Я собираюсь включить это в свой ответ и упомянуть ваше имя. - person Kelvin; 26.12.2011

module ActiveResource
  class Connection
    alias_method :origin_handle_response, :handle_response 
    def handle_response(response)
        Thread.current[:active_resource_connection_headers]  = response
        origin_handle_response(response)
    end  

    def response
      Thread.current[:active_resource_connection_headers]
    end   

  end
end    

также вы можете попробовать этот гем https://github.com/Fivell/activeresource-response

person Fivell    schedule 26.12.2011