9

我需要从可安装引擎的布局内部知道它当前安装在什么路径上。这样做的方法是什么?

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

  mount BackendCore::Engine => "/backend"

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

4

4 回答 4

10

如果引擎: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"

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

于 2012-02-08T12:26:23.673 回答
8

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

我找到了解决方案:

Rails.application.routes.named_routes[:backend_core].path #=> "/backend"
于 2011-09-28T09:09:06.620 回答
3

当引擎安装在其他引擎中时,评估路径以获得安装路径可能会产生意想不到的结果。

当您查看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
于 2016-03-10T12:54:20.610 回答
0

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

env["SCRIPT_NAME"] # => "/backend"
于 2016-05-14T16:27:32.200 回答