ruby-on-rails - 如何通过更改基类将 Ruby/Rails 方法包装在子类中?

标签 ruby-on-rails ruby oop polymorphism object-oriented-analysis

我有一个 Ruby/Rails 类 MyBase 定义如下:

module MyModule1
  class MyBase < Sinatra::Base
      register Sinatra::RespondTo
      register Sinatra::CrossOrigin

  ...

我定义了 MyBase 的子类,并有一个可以调用的 API someAction:

module MyModule1
  module MyModule2

    class MySubClass < MyModule1::MyBase
      post 'someAction' do
        ...
      end

      ...

MySubClass 中还有许多其他 API,为简洁起见,上面未显示。

我想计时并记录每次访问任何 API 的持续时间。我知道如何使用 STATSD Rails 模块计时,也知道如何记录。但是我应该在哪里/如何放置这个计时代码以保持我的代码干燥?我只想写一次,最好是在基类中。但我不知道如何定义一个基类方法来包装子类方法并在子类方法触发时调用。

最佳答案

您正在寻找的是 Rack 中间件。

你可以像这样注入(inject)你自己的。由于这一点,响应记录时间的逻辑完全从您的 Sinatra 应用程序中删除,因为它在请求的底层工作(Sinatra 构建在原始 Rack 应用程序之上)。

class MeasureResponse
  def initialize(app)
    @app = app
  end

  def call(env)
    start = Time.now
    status, headers, response = @app.call(env)
    stop = Time.now

    log_time(start, stop)

    [status, headers, response]
  end

  private

  def log_time(start, stop)
    total_time = start - stop
    puts "Time of request: #{total_time}" #replace with your logger
  end
end


module MyModule1
    class MyBase < Sinatra::MyBase
        configure do
            use MeasureResponse
        end

       post 'someAction' do
         ...
       end
    end
end

关于ruby-on-rails - 如何通过更改基类将 Ruby/Rails 方法包装在子类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25876034/

相关文章:

java - 初学者java顺序递增设置变量并重置计数

oop - 我应该什么时候开始一个方法名称,它获取带有 "get-"前缀的属性?

ruby-on-rails - Rails 3 中虚拟属性的 counter_cache

ruby - 如何在终端中并排绘制卡片对象与堆叠在一起

ruby - `<module:Templates>':使用 Sinatra/Unicorn 的未初始化常量 Tilt::CompileSite (NameError)

ruby - 安装 FXRuby Gem

javascript - 在 Javascript 中更改选定的对象

ruby-on-rails - 战俘 : display development log and use Pry?

ruby-on-rails - Redmine:安装时出现 rake 错误

ruby-on-rails - 如何将Elasticsearch Analyzer添加到SearchKick