如何记录ActiveResource使用的URL?

时间:2010-09-08 01:19:28

标签: ruby-on-rails logging activeresource

Rails ActiveResource很棒......除了一件事:据我所知,没有办法看到它在幕后使用的是什么网址。例如,假设我有一个名为Issue的ActiveResource,用于myIssues.com/issues.xml上的web服务。如果我这样做:

Issue.find(:all, :params => {:page => 2})

我希望ActiveResource可以调用:

myIssues.com/issues.xml?page=2

......但我实际上并不知道。据我所知,ActiveResource可能已经决定它不喜欢单词“page”,所以它实际上是在使用:

myIssues.com/issues.xml?mod_page=2

这使调试变得困难。现在我有一种情况,如果我去了认为 ActiveResource正在使用的URL,它可以正常工作。但是,当我实际使用ActiveResource时,它不起作用。看到它的GETing会对此非常有帮助,所以......

有没有人知道记录(或以其他方式输出;如果有一些资源也会很有效的资源.url方法)的方法,那么ActiveResource用来做它的事情的URL?

3 个答案:

答案 0 :(得分:24)

如果您将以下行添加到environment.rb文件中,它至少会记录请求,以便您知道网址ActiveResource正在点击:

ActiveResource::Base.logger = ActiveRecord::Base.logger

我仍在寻找一个更好的解决方案,向我展示响应和发布到更新呼叫的数据,但至少这是朝着正确方向迈出的一步。我真的不确定为什么ActiveResource有一个单独的记录器开始,但那是另一回事。

答案 1 :(得分:7)

我刚刚遇到了同样的问题,并在我寻找答案时遇到了这篇文章。我发现的,事实证明是有用的,是ActiveResource :: Base上的collection_path方法。例如,假设您拥有以下资源:

class UserPost < ActiveResource::Base
    self.site = "http://someApp.com/user/:user_id"
    self.element_name = "post"

如果你去rails控制台,这里有一些输出的例子:

>> UserPost.collection_path
"/user//post"
>> UserPost.collection_path(:user_id => 5)
"/user/5/post

这应该为您提供确定ActiveResource如何将您的请求转换为URL所需的确切内容。

答案 2 :(得分:2)

enter image description here

要获取ActiveResource的详细信息登录,必须在gem(method内修补请求方法。

将波纹管文件放在config/initializers内,您将获得 http方法,路径,请求正文,请求hedaers

如果需要,

响应正文和标头已经存在。 doc

config / initializers / activeresource_patch.rb

module ActiveResource
  class Connection
    private
      def request(method, path, *arguments)
        result = ActiveSupport::Notifications.instrument("request.active_resource") do |payload|
          payload[:method]      = method
          payload[:request_uri] = "#{site.scheme}://#{site.host}:#{site.port}#{path}"
          payload[:request_path] = path
          payload[:request_body] = arguments[0]
          payload[:request_headers] = arguments[1]
          payload[:result]      = http.send(method, path, *arguments)
        end
        handle_response(result)
      rescue Timeout::Error => e
        raise TimeoutError.new(e.message)
      rescue OpenSSL::SSL::SSLError => e
        raise SSLError.new(e.message)
      end
  end
end

config / initializers / activeresource_logger.rb

Rails.application.configure do

  def activeresource_logger
  @activeresource_logger ||= Logger.new("#{Rails.root}/log/activeresource_logger.log")
  end

  ActiveSupport::Notifications.subscribe('request.active_resource')  do |name, start, finish, id, payload|
   if Rails.env.development?
    activeresource_logger.info("====================== #{start} : #{payload[:method].upcase} ======================")
    activeresource_logger.info("PATH: #{payload[:request_path]}")
    activeresource_logger.info("BODY: #{payload[:request_body]}")
    activeresource_logger.info("HEADERS: #{payload[:request_headers]}")
    # activeresource_logger.info("STATUS_CODE: #{payload[:result].code}")
    # activeresource_logger.info("RESPONSE_BODY: #{payload[:result].body}")
   end
  end

end