2017-02-01 24 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方面有什么缺点?再次感谢 –

相关问题