如何记录ActiveResource使用的URL?

Rails ActiveResource很棒……除了一件事:据我所知,没有办法看到它在幕后使用的是什么URL。 例如,假设我有一个名为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会对此非常有帮助,所以…

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

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

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

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

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

在此处输入图像描述

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

config/initializers放置bellow文件,您将获得http方法,路径,请求正文,请求hedaers

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

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