Was*_*per 5 ruby rack ruby-on-rails ruby-on-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
Run Code Online (Sandbox Code Playgroud)
我以为我可以使用以下条件:
# 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
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢。
中间件在到达控制器逻辑之前就被调用,因此无法根据操作来限制中间件。
也就是说,中间件可以看到正在调用哪个路由,并且可以根据路由有条件地执行操作。我快速进行了谷歌搜索,看起来机架跟踪器没有内置选项来执行此操作。但是,您可以通过将此中间件包装在另一个中间件中来规避此问题,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
进而:
# config/application.rb
config.middleware.use ConditionalTracker
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3239 次 |
最近记录: |