我有一个 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/