确定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?