23

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

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

我希望 ActiveResource 会调用:

myIssues.com/issues.xml?page=2

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

myIssues.com/issues.xml?mod_page=2

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

有谁知道记录(或以其他方式输出;如果有一些 resource.url 方法也可以很好地工作)ActiveResource 用来做它的事情的 URL 的方法吗?

4

3 回答 3

25

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

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

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

于 2010-11-11T00:04:15.943 回答
9

我刚刚遇到了同样的问题,并在寻找答案时遇到了这篇文章。我确实发现,这被证明是有用的,是 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 所需的确切信息。

于 2011-10-14T20:15:45.200 回答
2

在此处输入图像描述

要获取ActiveResource 的详细登录信息,必须在 gem(方法.

将以下文件放入其中config/initializers,您将获得http 方法、路径、请求正文、请求 hedaers

如果您需要,响应正文和标题已经存在。文档

配置/初始化程序/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

配置/初始化程序/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
于 2018-08-16T04:42:45.587 回答