如何将Rails Engine的路由移动到rails主路由?

时间:2017-05-10 10:26:28

标签: ruby-on-rails ruby-on-rails-4 routes rails-routing rails-engines

我使用Rails 4.2和Rails Engine来处理我的管理面板。我想将引擎代码移动到主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 admin_countries_url但对于网址,您需要使用类似{{1}的内容访问该网址(这是引擎的默认行为,我想保持这种方式)。

我所做的是将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,如:

admin

然后,我需要使用Rails.application.routes.draw do namespace :admin do resources :countries, only: [:index] end end 来引用国家网址,这不是我需要的行为。

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

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

1 个答案:

答案 0 :(得分:1)

使用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