如何为 Rails 5 中的特定控制器操作跳过 config.middleware.use

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)

任何帮助深表感谢。

eik*_*iko 1

中间件在到达控制器逻辑之前就被调用,因此无法根据操作来限制中间件。

也就是说,中间件可以看到正在调用哪个路由,并且可以根据路由有条件地执行操作。我快速进行了谷歌搜索,看起来机架跟踪器没有内置选项来执行此操作。但是,您可以通过将此中间件包装在另一个中间件中来规避此问题,如下所示:

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)