23

Rails ActiveResource は素晴らしいです... 1 つのことを除いて: 私が知る限り、舞台裏で使用されている URL を確認する方法はありません。たとえば、myIssues.com/issues.xml の Web サービスに対して、Issue という ActiveResource があるとします。私が行った場合:

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 を確認すると、これが非常に役立つので、...

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( method .

次のファイルを内部に配置すると、 http メソッド、パス、リクエスト ボディ、リクエスト ヘッダーconfig/initializersが取得されます

必要に応じて、応答の本文とヘッダーが既に存在します。文書

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
于 2018-08-16T04:42:45.587 に答える