如何将 Rails 引擎的路线移动到 rails 主要路线?

How to move Rails Engine's route to rails main routes?

我正在使用 Rails 4.2 和 Rails 引擎来处理我的管理面板。我想将引擎代码移动到主 rails 应用程序,其中一部分是移动路线。

现在,我在引擎 my-web-app/lib/admin/config/routes.rb 中的路线是这样的:

Admin::Engine.routes.draw do
  resources :countries, only: [:index]
end

在我的应用程序的路线 config/routes.rb:

Rails.application.routes.draw do
  .. some routes ...
  mount GlobalAdmin::Engine => "/admin"
end

现在引擎的国家路线是 countries_url NOT admin_countries_url 但对于 URL 你需要用类似的东西访问它admin/countries(这是引擎的默认行为,我想保持这种方式)。

我所做的是将 my-web-app/lib/admin/config/routes.rb 移动到 my-web-app//config/routes.admin.rb 并使其看起来像:

Rails.application.routes.draw do
  resources :countries, only: [:index]
end

然后在我的 config/application.rb 中添加了如下内容:

config.paths["config/routes.rb"] = [
  Rails.root.join("config/routes.admin.rb"),
  Rails.root.join("config/routes.rb")
]

这种方法的问题是我有 countries_url,但是,我无法像 admin/countries 那样使用管理命名空间 URL 访问它。如果我添加命名空间 admin 类似:

Rails.application.routes.draw do
  namespace :admin do
    resources :countries, only: [:index]
  end
end

然后我需要用 admin_countries_url 引用国家 url,这不是我需要的行为。

如何在不影响以前的引擎路线的情况下从引擎中移动路线的任何帮助?

我知道默认情况下,引擎内部的路由与应用程序是隔离的。应用程序及其引擎可以具有相同名称的路由,因此将两者集成可能会导致一些问题,但是我想尽可能保留确切的路由,而不是添加名称空间并坚持使用确切的路由名称。

使用scope代替namespace:

Rails.application.routes.draw do
  scope path: "/admin" do
    resources :countries
  end
end

max@MaxBook ~/p/sandbox> rails routes
      Prefix Verb   URI Pattern                         Controller#Action
   countries GET    /admin/countries(.:format)          countries#index
             POST   /admin/countries(.:format)          countries#create
 new_country GET    /admin/countries/new(.:format)      countries#new
edit_country GET    /admin/countries/:id/edit(.:format) countries#edit
     country GET    /admin/countries/:id(.:format)      countries#show
             PATCH  /admin/countries/:id(.:format)      countries#update
             PUT    /admin/countries/:id(.:format)      countries#update
             DELETE /admin/countries/:id(.:format)      countries#destroy