Как вы регистрируете URL-адрес, который использует ActiveResource?

Rails ActiveResource великолепен... за исключением одного: насколько я могу судить, нет способа увидеть, какой URL он использует за кулисами. Например, предположим, что у меня есть ActiveResource с именем Issue для веб-службы по адресу myIssues.com/issues.xml. Если я сделаю:

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

Я ожидаю, что ActiveResource вызовет:

myIssues.com/issues.xml?page=2

... но я на самом деле этого не знаю. Насколько я знаю, ActiveResource мог решить, что ему не нравится слово «страница», поэтому он фактически использует:

myIssues.com/issues.xml?mod_page=2

Это затрудняет отладку. Прямо сейчас у меня возникла ситуация, когда, если я перехожу по URL-адресу, который думаю использует ActiveResource, он работает нормально. Однако, когда я на самом деле использую ActiveResource, это не работает. Просмотр URL-адреса, который он получает, был бы очень полезен в этом, так что...

Кто-нибудь знает способ регистрировать (или иным образом выводить, если есть какой-то метод resource.url, который тоже отлично работает) URL-адреса, которые ActiveResource использует для своей работы?


person machineghost    schedule 08.09.2010    source источник


Ответы (3)


Если вы добавите следующую строку в свой файл environment.rb, он, по крайней мере, будет регистрировать запросы, чтобы вы знали, что URL-адреса ActiveResource попадают:

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

Я все еще ищу лучшее решение, которое показывает мне ответ и данные, отправленные для обновления вызовов, но, по крайней мере, это шаг в правильном направлении. Я действительно не уверен, почему ActiveResource имеет отдельный регистратор для начала, но это другое дело.

person Jeff Whitmire    schedule 11.11.2010
comment
Если вы не используете ActiveRecord, просто используйте отдельный регистратор: active_resource_logger = Logger.new('log/active_resource.log', 'daily'); active_resource_logger.level = Rails.env.dev? ? Logger::DEBUG : Logger::INFO; ActiveResource::Base.logger = active_resource_logger - person aledalgrande; 18.07.2013
comment
Я знаю, что он очень старый, но гем http_logger (https://github.com/railsware/http_logger) прекрасно работает. для этого. Вы можете увидеть HTTP-запрос, который отправляется на сайт ActiveResource, и любые ошибки, которые он может выдать вам, когда вы установите HttpLogger.log_request_body = true - person John Jensen; 05.10.2015
comment
Вы также можете сделать ActiveResource::Base.logger = Rails.logger, если вы не используете ActiveRecord. - person Jeremiah; 16.12.2015

Я только что столкнулся с этой же проблемой и наткнулся на этот пост, когда искал ответы. Что я действительно нашел полезным, так это метод collection_path для ActiveResource::Base. Например, предположим, что у вас есть следующий ресурс:

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-адрес.

person zwickilton    schedule 14.10.2011

введите здесь описание изображения

Чтобы получить подробный логин для ActiveResource, необходимо исправить метод запроса внутри драгоценного камня (метод.

поместите следующие файлы внутрь config/initializers, вы получите метод http, путь, тело запроса, хедеры запроса

тело и заголовок ответа уже есть, если вам нужно. документ

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
person Alupotha    schedule 16.08.2018