我有一个独立的、可安装的 Rails 引擎,它将自身安装在主机应用程序中已声明的命名空间中。它或多或少看起来是这样的:
插件中的routes.rb:
# my_engine/config/routes.rb
MyEngine::Engine.routes.draw do
namespace :admin do
resources :some_resource
end
end
Run Code Online (Sandbox Code Playgroud)
以及主机应用程序的routes.rb中的适当片段:
# config/routes.rb
mount MyEngine::Engine, at: "/"
namespace :admin do
resources :host_resource
end
Run Code Online (Sandbox Code Playgroud)
我正在安装引擎,/
因为引擎中应该有一些可用的路由,并且管理命名空间重叠是有意的。
这些路线会生成几个路径助手,包括my_engine.admin_some_resources_path
和 我期望的admin_host_resources_path
. 后者是行不通的。
假设主应用程序中有一个控制器声明如下:
# app/controllers/admin/application_controller.rb
class Admin::ApplicationController < ApplicationController
layout 'admin'
end
Run Code Online (Sandbox Code Playgroud)
并且引擎的 AdminController 的声明方式是继承它:
# my_engine/app/controlles/admin/application_controller.rb
class MyEngine::Admin::ApplicationController < Admin::ApplicationController
end
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都按预期进行。现在,假设在主应用程序的admin
布局中,从 Admin::ApplicationController 引用,我尝试使用本质上类似的东西:
# app/views/layouts/admin.html.erb
<%= link_to "Host resources", admin_host_resources_path %>
<%= link_to "Plugin's resources", my_engine.admin_some_resources_path %>
Run Code Online (Sandbox Code Playgroud)
当我加载像“/admin/host_resources”这样的路径时,这工作得很好 - 它从主应用程序渲染管理布局没有问题。当打开路径“/admin/some_resources”(进入插件)时,它会停止工作,抱怨 …