5

現在のパスがマウントされたエンジンにあるかどうかを判断するために、この投稿で概説されている方法を使用しようとしていますurl_forが、正確に使用する方法を理解するのに苦労しています(概説Journey::Path::Patternされた方法によって返されるものです)mounted_path別の投稿で)。

class Rails::Engine
  def self.mounted_path
    route = Rails.application.routes.routes.detect do |route|
      route.app == self
    end
    route && route.path
  end
end

特に役に立たなかった公式ドキュメントを除いて、どこでもあまり議論されていないようです。解決策は比較的単純であると確信しており、私が書こうとしているヘルパー メソッドの要点は以下のとおりです。

def in_engine? engine
  current_url.include?(engine.mounted_path)
end

編集:

エンジンの一部はサブドメインとしてマウントされ、一部はアプリ自体にマウントされているため、現在のサブドメインがマウントされたパスと同じかどうかを単純に確認したり、path_for.

4

1 に答える 1

0

正確な解決策ではありませんが、おそらく有用なリードです。

私はあなたの質問が興味深いと思ったので、レールソースの奥深くを掘り下げ始めました...なんて恐ろしい、しかし有益な旅です:D

Rails のルーターには、 を引数として受け取り、リクエストに一致するルートを生成するrecognize メソッドがあることがわかりました。request

ルートにはappエンジンと比較できるメソッドがあり、request(http メソッド、サブドメインなどを考慮して) オブジェクトにアクセスできるため、ルーター インスタンスに直接アクセスする方法がわかれば、あなたは次の行に沿って何かをすることができるはずです:

  def in_engine?(engine)
    router.recognize(request) do |route,*| 
      return true if route.app == engine
    end
    false
  end

編集

私は見つけたと思いますが、ここでは遅く、これをテストするレールアプリが手元にありません:(

  def in_engine?(engine)
    # get all engine routes. 
    # (maybe possible to do this directly with the engine, dunno)
    engine_routes = Rails.application.routes.set.select do |route| 
      route.app == engine
    end
    !!engine_routes.detect{ |route| route.matches?(request) }
  end

編集

また、おそらくより簡単な回避策はこれを行うことです:

メインアプリで

  class ApplicationController < ActionController::Base
    def in_engine?(engine)
      false
    end
    helper_method :in_engine?
  end

次に、エンジンのアプリケーション コントローラーで

  def in_engine?(engine)
    engine == ::MyEngine
  end
  helper_method :in_engine?
于 2013-10-31T21:14:22.830 に答える