将大的routes.rb划分为Rails 5中的多个文件

Sho*_*chi 4 ruby-on-rails-5

我想将我的rails 4 app升级到5.0.0.beta2.目前我routes.rb通过设置config.paths["config/routes.rb"]例如,将文件分成多个文件,

module MyApp
  class Application < Rails::Application
    config.paths["config/routes.rb"]
      .concat(Dir[Rails.root.join("config/routes/*.rb")])
  end
end
Run Code Online (Sandbox Code Playgroud)

似乎rails 5.0.0.beta2也暴露config.paths["config/routes.rb"]但上面的代码不起作用.如何routes.rb在rails 5中分割文件?

Mar*_*n13 10

从多个文件加载路由的 Rails 6.1+ 内置方式。

来自官方 Rails 文档


将非常大的路由文件分解为多个小的路由文件:

如果您在具有数千条路由的大型应用程序中工作,则单个config/routes.rb文件可能会变得笨重且难以阅读。

Rails 提供了一种routes.rb使用 draw 宏将巨大的单个文件分解为多个小文件的方法。

# config/routes.rb

Rails.application.routes.draw do
  get 'foo', to: 'foo#bar'

  draw(:admin) # Will load another route file located in `config/routes/admin.rb`
end

# config/routes/admin.rb

namespace :admin do
  resources :comments
end
Run Code Online (Sandbox Code Playgroud)

draw(:admin)Rails.application.routes.draw块内部调用将尝试加载与给定参数同名的路由文件(admin.rb在本例中)。该文件需要位于config/routes目录或任何子目录(即config/routes/admin.rbconfig/routes/external/admin.rb)内。

您可以在admin.rb路由文件中使用普通的路由 DSL ,但是您不应该Rails.application.routes.draw像在主config/routes.rb文件中那样用块包围它。


链接到相应的 PR

  • 酷,6.1之后我会迁移到官方方式。谢谢! (2认同)

小智 7

你可以在config/application.rb中编写一些代码

config.paths ['config/routes.rb'].concat Dir [Rails.root.join("config/routes/*.rb")]


And*_*nga 6

这是一篇很好的文章,简单,简洁,直截了当 - 不是我的.

配置/ application.rb中

module YourProject
  class Application < Rails::Application
    config.autoload_paths += %W(#{config.root}/config/routes)
  end
end
Run Code Online (Sandbox Code Playgroud)

配置/路由/ admin_routes.rb

module AdminRoutes
  def self.extended(router)
    router.instance_exec do
      namespace :admin do
        resources :articles
        root to: "dashboard#index"
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

配置/ routes.rb中

  Rails.application.routes.draw do
    extend AdminRoutes

    # A lot of routes
  end
Run Code Online (Sandbox Code Playgroud)


Jas*_*ett 5

我喜欢这个要点中演示的方法,并在这篇博文中进行了扩展:

class ActionDispatch::Routing::Mapper
  def draw(routes_name)
    instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
  end
end

BCX::Application.routes.draw do
  draw :api
  draw :account
  draw :session
  draw :people_and_groups
  draw :projects
  draw :calendars
  draw :legacy_slugs
  draw :ensembles_and_buckets
  draw :globals
  draw :monitoring
  draw :mail_attachments
  draw :message_preview
  draw :misc

  root to: 'projects#index'
end
Run Code Online (Sandbox Code Playgroud)