【问题标题】:How to move Rails Engine's route to rails main routes?如何将 Rails Engine 的路线移动到 Rails 主要路线?
【发布时间】:2017-10-08 22:40:59
【问题描述】:

我正在使用带有 Rails Engine 的 Rails 4.2 来处理我的管理面板。我想将引擎代码移动到主 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 引用国家/地区网址,这不是我需要的行为。

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

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

【问题讨论】:

  • 能否请您明确说明期望的结果是什么?
  • 当然,感谢您愿意帮助@max。因此,使用我的引擎时,我有countries_url 路径名。现在通过重构和从引擎移动路径,我仍然想要countries_url 路径。然而,就像我之前的实现一样,我希望 URL 看起来像 admin/countries
  • 如果您的引擎路线类似于:Admin::Engine.routes.draw do; resources :countries, only: [:index];end,并且它的安装方式类似于:Rails.application.routes.draw do; mount GlobalAdmin::Engine => "/admin"; end。然后我们将得到countries_url 路径,并且可以通过/admin/countries 访问URL,我想要完全相同的行为。

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


【解决方案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

【讨论】:

  • 太棒了,这正是我想要的。非常感谢@max
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多