ruby on rails - ¿Cómo se registra la URL que utiliza ActiveResource?
ruby-on-rails logging (3)
Me acabo de encontrar con este mismo problema y encontré esta publicación cuando buscaba respuestas. Lo que encontré, que resultó ser útil, es el método collection_path en ActiveResource :: Base. Entonces, por ejemplo, digamos que tiene el siguiente recurso:
class UserPost < ActiveResource::Base
self.site = "http://someApp.com/user/:user_id"
self.element_name = "post"
Si vas a la consola de rieles, aquí hay algunos ejemplos de la salida:
>> UserPost.collection_path
"/user//post"
>> UserPost.collection_path(:user_id => 5)
"/user/5/post
Esto debería proporcionarle exactamente lo que necesita para determinar cómo ActiveResource está traduciendo su solicitud en una URL.
Rails ActiveResource es impresionante ... excepto por una cosa: por lo que puedo decir, no hay manera de ver qué URL está usando detrás de escena. Por ejemplo, digamos que tengo un ActiveResource llamado Issue, para un servicio web en myIssues.com/issues.xml. Si lo hago:
Issue.find(:all, :params => {:page => 2})
Espero que ActiveResource haga una llamada a:
myIssues.com/issues.xml?page=2
... pero en realidad no lo sé. Por lo que sé, ActiveResource podría haber decidido que no le gusta la palabra "página", por lo que en realidad está usando:
myIssues.com/issues.xml?mod_page=2
Esto hace que la depuración sea difícil. En este momento tengo una situación en la que, si voy a la URL, creo que está utilizando ActiveResource, funciona bien. Sin embargo, cuando realmente uso ActiveResource, no funciona. Ver la URL que está obteniendo sería de gran ayuda para esto, así que ...
¿Alguien sabe una manera de registrar (o de otro modo producir); si hay algún método resource.url que también funcione bien) las URL que ActiveResource utiliza para hacer su trabajo?
Si agrega la siguiente línea a su archivo environment.rb
, al menos registrará las solicitudes para que sepa que las URLs ActiveResource
están golpeando:
ActiveResource::Base.logger = ActiveRecord::Base.logger
Todavía estoy buscando una mejor solución que me muestre la respuesta y los datos publicados para actualizar las llamadas, pero al menos este es un paso en la dirección correcta. Realmente no estoy seguro de por qué ActiveResource
tiene un registrador separado para empezar, pero eso es otra cuestión.
Para obtener información detallada de inicio de sesión para ActiveResource, debe aplicar el método de solicitud dentro de la gema ( method .
coloque los siguientes archivos dentro de config/initializers
obtendrá el método http, ruta, cuerpo de solicitud, hedaers de solicitud
El cuerpo de la respuesta y el encabezado ya están ahí si lo necesitas 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