我需要从可安装引擎的布局内部知道它当前安装在什么路径上。这样做的方法是什么?
例如,我的 routes.rb 包含以下行:
mount BackendCore::Engine => "/backend"
从 BackendCore 内部,我需要访问“/backend”的值。
我需要从可安装引擎的布局内部知道它当前安装在什么路径上。这样做的方法是什么?
例如,我的 routes.rb 包含以下行:
mount BackendCore::Engine => "/backend"
从 BackendCore 内部,我需要访问“/backend”的值。
如果引擎: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"