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

时间:2013-10-18 18:08:49

标签: ruby-on-rails ruby rails-routing

我正在尝试将this post概述的方法与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

除了the official documentation之外,其他地方似乎没有太多的讨论,这并不是特别有用。我确定解决方案相对简单,我正在尝试编写的辅助方法的要点如下:

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

修改

我的一些引擎作为子域安装,一些安装在应用程序本身内,这使我无法简单地检查当前子域是否与挂载的路径相同,或者使用path_for

1 个答案:

答案 0 :(得分:0)

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

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

事实证明,Rails的路由器有recognize method接受request作为参数,并产生与请求匹配的路由。

由于路线具有app方法,您可以与引擎进行比较,并且您可以访问request对象(考虑到http方法,子域等),< strong>如果你发现如何直接访问路由器实例,你应该能够做到以下几点:

  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?