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

时间:2011-09-28 07:20:13

标签: ruby-on-rails ruby-on-rails-3.1 routes rails-engines

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

E.g。我的routes.rb包含以下行:

  mount BackendCore::Engine => "/backend"

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

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:8)

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

我找到了解决方案:

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

答案 2 :(得分:4)

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

当您查看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

答案 3 :(得分:0)

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

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