【问题标题】:What path is a mountable engine mounted on可挂载引擎安装在什么路径上
【发布时间】:2011-11-26 15:14:55
【问题描述】:

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

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

  mount BackendCore::Engine => "/backend"

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

【问题讨论】:

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


【解决方案1】:

如果引擎使用不同的名称: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 4 引擎中使用这种技术。谢谢!
【解决方案2】:

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

我找到了解决办法:

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

【讨论】:

  • 谢谢哥们,这个真的帮了我:)
【解决方案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

【讨论】:

    【解决方案4】:

    您可以简单地使用以下代码来判断引擎在引擎控制器/视图中挂载到的路径:

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

    【讨论】:

    • 应该不可能在没有解释的情况下投反对票。我怎么能相信这种否决票是否有意义?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多