可安装的发动机安装在哪条路径上

我需要知道,从可安装引擎的布局内部,它当前正在安装的路径。 怎么办呢?

例如我的routes.rb包含以下行:

mount BackendCore::Engine => "/backend" 

从BackendCore内部,我需要访问“/ backend”的值。

如果引擎是mouted :as =>一个不同的名称,查询named_routes是不够的。 这个猴子补丁会做:

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

现在在引擎上调用mounted_path

 BackendCore::Engine.mounted_path => "/backend" 

注意:请注意,在生产模式下,在加载主应用程序的路由之前,会评估引擎中的类。 在类宏中调用此方法可能不起作用!

更新:这可能仅适用于Rails 3!

我找到了解决方案:

 Rails.application.routes.named_routes[:backend_core].path #=> "/backend" 

当引擎安装在其他引擎内时,评估获取安装路径的路径可能会产生意外结果。

当您查看https://github.com/rails/rails/pull/5008时,您可以阅读Jose Valim的评论:

此外,发动机可以安装在另一个发动机内,因此不太可能为您提供正确的结果。 最好的选择可能是配置选项,开发人员将设置路径。

为了获得一致的结果,我现在在引擎上使用了一个访问器。

例如:

 # APP/initializers/backend_core_engine.rb BackendCore::Engine.mount_path = "/backend" # APP/config/routes.rb mount BackendCore::Engine => BackendCore::Engine.mount_path # ENGINE/backend_core/lib/engine.rb module BackendCore class Engine < ::Rails::Engine cattr_accessor :mount_path end end 

您可以简单地使用以下代码来告知引擎控制器/视图中安装的路径引擎:

 env["SCRIPT_NAME"] # => "/backend"