2014-05-14 78 views
0

我需要在服務器獲取請求時獲取uuid或時間請求。在Rails中很容易,但我正在開發一個gem,我希望它更通用。所以我希望它能和Sinatra以及其他在http服務器上運行的其他Ruby應用程序一起工作。HTTP請求uuid或Ruby應用程序中的請求開始時間

這是另一個問題,它是一個寶石。我不能將Time.now置於我的應用程序控制器的起始位置。我需要它是通用的,所以它應該適用於不同的框架。

你會提出什麼建議?

回答

1

您可以實現一個Rack中間件,您可以獨立於您的實際應用框架(只要它使用機架,至少Rails,Sinatra,Padriono和大多數其他Ruby Web框架都適用)。

Rails已經包含一箇中間件,用於向ActionDispatch::RequestId中所需的請求中添加唯一ID。另一種選擇可能是rack-request-id gem

這個中間件的最小版本看起來是這樣的:

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

    def call(env) 
    env['request_id'] = env['HTTP_X_REQUEST_ID'] || SecureRandom.uuid 
    env['request_started_at] = Time.now 

    @app.call(env) 
    end 
end 

然後,您可以在您的config.ru使用中間件或通過在Rails中添加以下內容到application.rb

config.middleware.use RequestIdMiddleware 
+0

但我做不到在沒有入侵Rails/Sinatra應用的寶石中使用它?不是每個用戶都有'config.ru',並且在Rails中我應該使用'config.middleware.use',在Sinatra'use'中,那麼其他框架呢?有沒有通用的解決方案? – ciembor

+0

每個使用機架的框架(正如我所說的,它是關於任何紅寶石web框架的)可以使用額外的機架中間件。事實上,機架的大部分默認功能都由機架中的多箇中間件類提供。因此,機架中間件**是通用解決方案。如何在實際框架中設置中間件是不同的,但所有框架最終都可以使用它。 –