2017-02-01 17 views
2

config.middleware.useを設定して、特定のコントローラアクションを除外/無視/スキップする方法はありますか?Rails 5の特定のコントローラアクションのconfig.middleware.useをスキップする方法

例えば、Post#showコントローラーの操作を除外したければ、

私はhttps://github.com/railslove/rack-trackerを使用してGoogleアナリティクス/タグマネージャをテストしています。

# 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

ミドルウェアがコントローラロジックに到達する前に呼び出されるため、アクションに基づいてミドルウェアを制限する方法はありません。

ミドルウェアは、どのルートが呼び出されているかを知ることができ、ルートによって条件付きで動作することができます。私はすばやいgoogle検索をしましたが、ラックトラッカーにはこれを行うための組み込みオプションがないようです。

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 

、その後:時間を取って、英子を返信用

# config/application.rb 

config.middleware.use ConditionalTracker 
+0

おかげしかし、あなたはそうのように、別のミドルウェアでは、このミドルウェアをラップすることにより、これを回避することができます。 .matchメソッドについての質問ですが、これはルート経由のPost#showアクションとどのように動作するのでしょうか?したがって、投稿のパスが「posts/hello-world /」の場合、これは一致しますか? env ['REQUEST_PATH']。match(/ \/posts \/show \ /?/)がどのように動作するかを理解しようとしています。ありがとうございました –

+0

ええ、.matchは正規表現を使用して着信要求のパスを分析します。 routes.rbファイルがどのように見えるのかわからなかったので、私は/ posts/show /を汎用パスとして選択しました。あなたの投稿がパス/投稿/投稿の名前にある場合、私の正規表現は機能しません。 '/ \/posts \/[\ w ' - ] + \ /?/' – eiko

+0

こんにちは@eiko。私は最終的に私が望んだ(レールコンソールを介してテスト)正規表現を持っていますが、私はアプリケーションを起動するときにエラーが発生しています:#の未定義のメソッド 'ハンドラー '、tracker.handler:google_tag_manager、 {container:ENV ['GTM_CONTAINER_ID']}ミドルウェアの呼び出し方法の中で、Rack Trackerを実行するという点で欠けているものがありますか?再びありがとう –

関連する問題