Разделите большой routes.rb на несколько файлов в Rails 5

Я хочу обновить свое приложение rails 4 до 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

Кажется, что rails 5.0.0.beta2 также предоставляет config.paths["config/routes.rb"], но приведенный выше код не работает. Как можно разделить routes.rb файл по 5 рельсам?


person Shouichi    schedule 24.02.2016    source источник


Ответы (4)


Rails 6.1+ встроенный способ загрузки маршрутов из нескольких файлов.

Из официальных документов Rails < / а>:


Разделение очень большого файла маршрута на несколько маленьких:

Если вы работаете в большом приложении с тысячами маршрутов, один config/routes.rb файл может стать громоздким и трудным для чтения.

Rails предлагает способ разбить один гигантский файл routes.rb на несколько небольших с помощью макроса рисования.

# 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

Вызов draw(:admin) внутри самого блока Rails.application.routes.draw будет пытаться загрузить файл маршрута, имя которого совпадает с именем заданного аргумента (в данном случае admin.rb). Файл должен находиться внутри каталога config/routes или любого подкаталога (например, config/routes/admin.rb или config/routes/external/admin.rb).

Вы можете использовать обычный DSL маршрутизации внутри файла маршрутизации admin.rb, однако не следует окружать его блоком Rails.application.routes.draw, как вы это делали в основном файле config/routes.rb.


Ссылка на соответствующий PR.

person Marian13    schedule 20.09.2020
comment
Круто, перейду на официальный способ после 6.1. Спасибо! - person Shouichi; 22.09.2020

вы можете написать несколько кодов в config / application.rb

config.paths['config/routes.rb'] = Dir[Rails.root.join('config/routes/*.rb')]
person 我爱爸爸妈妈    schedule 10.03.2016
comment
Большое спасибо. Это решение также автоматически перезагружает маршруты при изменении кода. Дополнительная информация приведена здесь: makandracards. com / makandra / Обратите внимание, что если в ваших исходных маршрутах ваш код находился в области видимости, ваш новый файл маршрутов также должен иметь эту область видимости. - person Natan Rubinstein; 14.02.2019
comment
Это решение, похоже, не работает, когда у вас есть определенные проблемы и вы ссылаетесь на них из одного файла маршрута в другой. - person Alter Lagos; 03.12.2019

Вот хорошая статья, простая, лаконичная, по существу - не мое.

config / application.rb

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

config / routes / 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

config / routes.rb

  Rails.application.routes.draw do
    extend AdminRoutes

    # A lot of routes
  end
person AndreiMotinga    schedule 10.08.2017
comment
Можно ли использовать это решение, и рельсы будут автоматически перезагружаться при изменении файла маршрутов? - person Natan Rubinstein; 14.02.2019
comment
Rails, кажется, предлагает официальный способ для такого случая, который выглядит проще. edgeguides.rubyonrails. org / - person Mitsutoshi Watanabe; 09.05.2020

Мне нравится метод, продемонстрированный в этой сути и расширенный в это сообщение в блоге:

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
person Jason Swett    schedule 30.10.2019
comment
Мы используем это довольно давно, но, к сожалению, он не перезагружает маршруты автоматически, и вам придется запускать / останавливать сервер. - person Cyril Duchon-Doris; 13.04.2020