我正在尝试将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
。
答案 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?