可安装的发动机安装在哪条路径上
我需要知道,从可安装引擎的布局内部,它当前正在安装的路径。 怎么办呢?
例如我的routes.rb包含以下行:
mount BackendCore::Engine => "/backend"
从BackendCore内部,我需要访问“/ backend”的值。
如果引擎是mouted :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"