删除主应用程序中路径助手中对 main_app 前缀的需要

Paw*_*Wal 4 rails-engines ruby-on-rails-4

我有一个独立的、可安装的 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”(进入插件)时,它会停止工作,抱怨admin_host_resources_path找不到。当我将其更改为以下内容时,它开始工作:

# app/views/layouts/admin.html.erb
<%= link_to "Host resources", main_app.admin_host_resources_path %>
<%= link_to "Plugin's resources", my_engine.admin_some_resources_path %>
Run Code Online (Sandbox Code Playgroud)

这不是我想要的,也不是我期望的。另外,我已经看过足够多的 Rails 插件,知道这不是必需的,但在阅读了 Engines 文档后,我仍然不知所措。我也搜索过Stack,但没有结果。我的问题是:如何包含 main_app 帮助程序以便不再需要前缀 main_app

值得注意的是,host_resource 的视图位于主应用程序本身中,而 some_resource 的视图位于引擎中。但这并不重要,因为不起作用的视图是admin主应用程序中的布局。

还请原谅高度匿名的代码,但这是我的要求。

Mar*_*per 6

将其添加到您的控制器中:

helper Rails.application.routes.url_helpers
Run Code Online (Sandbox Code Playgroud)