我需要知道,从可安装引擎的布局内部,它当前正在安装的路径。怎么办呢?
E.g。我的routes.rb包含以下行:
mount BackendCore::Engine => "/backend"
从BackendCore内部,我需要访问“/ backend”的值。
答案 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"