2017-02-01 28 views
2

有沒有辦法設置config.middleware.use來排除/忽略/跳過特定的控制器操作?如何在Rails 5中跳過config.middleware.use進行特定的控制器操作

例如,如果我想排除Post#show控制器操作。

我使用https://github.com/railslove/rack-tracker來測試Google Analytics/Tag Manager。

# Rack Tracker config 
    config.middleware.use(Rack::Tracker) do 
    handler :google_tag_manager, { container: ENV['GTM_CONTAINER_ID'] } 
    end 

我以爲我可以使用這樣一個條件:

# Rack Tracker config 
    config.middleware.use(Rack::Tracker) do 
    handler :google_tag_manager, { container: ENV['GTM_CONTAINER_ID'] } if app.route != ApplicationController::PostController.show 
    end 

任何幫助深表感謝。

回答

1

在控制器邏輯達到之前調用中間件,因此無法根據操作限制中間件。

這就是說,中間件CAN可以看到哪個路由被調用,並且可以根據路由有條件地執行。我做了一個快速的谷歌搜索,它看起來像機架跟蹤器沒有這樣做的內置選項。抽出時間和回覆英子

# config/application.rb 

config.middleware.use ConditionalTracker 
+0

感謝:但是,您可以通過在其他中間件包裝這個中間件,像這樣繞過此:

class ConditionalTracker def initialize(app) @app = app end def call(env) if env['REQUEST_PATH'].match(/\/posts\/show\/?/) tracker = Rack::Tracker.new(@app) do handler :google_tag_manager, { container: ENV['GTM_CONTAINER_ID'] } end env = tracker.call(env) end @app.call(env) end end 

,然後。有關.match方法的問題,這是否與通過路徑的Post#show動作相匹配,這是如何工作的?所以如果帖子路徑是「posts/hello-world /」,這將匹配?嘗試瞭解如果env ['REQUEST_PATH']。匹配(/ \/posts \/show \ /?/)如何工作。再次感謝 –

+0

是的,.match使用正則表達式來分析傳入請求的路徑。我選擇/ posts/show /作爲通用路徑,因爲我不知道你的routes.rb文件是什麼樣的。如果你的帖子位於路徑/ posts/name-of-post,那麼我的正則表達式將不起作用。嘗試用它替換它:'/ \/posts \/[\ w' - ] + \ /?/' – eiko

+0

嗨@eiko。我終於得到了我想要的正則表達式(通過Rails控制檯進行測試),但在啓動應用程序時出現錯誤:#的undefined方法'handler',與tracker.handler:google_tag_manager有關, {container:ENV ['GTM_CONTAINER_ID']}。在中間件調用方法中運行Rack Tracker方面有什麼缺點?再次感謝 –

相關問題