确定Journey :: Path :: Pattern是否与当前页面匹配

我正在尝试使用本文概述的方法与url_for一起确定当前路径是否在挂载的引擎中,但是我很难弄清楚如何使用Journey::Path::Pattern (其中是另mounted_path概述的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

不完全是一个解决方案,但可能是有用的领导。

我发现你的问题很有意思,所以我开始深入钻研铁轨来源…这是多么可怕而又富有启发性的旅行:D

事实certificate,Rails的路由器有一个接受request作为参数的recognize 方法 ,并产生与请求匹配的路由。

由于路由有一个app方法,你可以比较你的引擎,并且你可以访问request对象(考虑到http方法,子域等), 如果你发现如何直接访问路由器例如 ,你应该能够做一些事情:

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

编辑

我想我发现了,但现在已经很晚了,我手边没有rails应用来测试这个:(

  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?