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?
答案 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)
要获取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