rails 4:将routes.rb拆分为多个较小的文件

Rub*_*tic 17 split routes ruby-on-rails-4

我想在rails 4应用程序中拆分我的路由.对于rails 3,问题已被回答了几次,例如:

在rails 4中执行此操作的正确方法是什么?如何控制路由加载的顺序?

建议从rails 3问题:

application.rb中

    config.paths['config/routes'] = Dir["config/routes/*.rb"]
Run Code Online (Sandbox Code Playgroud)

失败:

/Users/jordan/.rvm/gems/ruby-2.0.0-head@books/gems/railties-4.0.0/lib/rails/application/routes_reloader.rb:10:in,scue in execute_if_updated':Rails :: Application :: RoutesReloader #cute_if_updated委托给updater.execute_if_updated,但updater为nil:

@route_sets = [#]>(RuntimeError)

cut*_*ion 18

我这样管理:

# config/application.rb
config.autoload_paths << Rails.root.join('config/routes')

# config/routes.rb
Rails.application.routes.draw do
  root to: 'home#index'

  extend ApiRoutes
end

# config/routes/api_routes.rb
module ApiRoutes
  def self.extended(router)
    router.instance_exec do
      namespace :api do
        resources :tasks, only: [:index, :show]
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

在这里,我将config/routes目录添加到其中定义的自动加载模块中.这将确保在这些文件更改时重新加载路由.

用于extend将这些模块包含在主文件中(它们将被自动加载,无需使用它们).

使用instance_execinside self.extended在路由器的上下文中绘制路由.


Mic*_*Cho 9

派对有点晚了,但你可以在Rails 4中通过猴子修补你的routes.rb文件顶部的映射器来做到这一点.即:

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

然后使用drawroutes.rb中的方法:

Rails.application.routes.draw do
  draw :api
end
Run Code Online (Sandbox Code Playgroud)

这将期望config/routes/api.rb中的文件.

稍微更全面的解释,这里有分割路径文件的例子.

  • 你建议猴子修补,而不会警告猴子补丁可能对项目造成的坏事. (3认同)
  • @yagooar,我在我的项目中使用它,它究竟是什么问题?快速谷歌搜索没有提供任何"坏"的东西 (2认同)

Nik*_*ola 4

2012 年 6 月,它从 Rails 4 中删除。5e7d6bba恢复了之前的提交,删除了对加载多个外部路由文件作为 config.rb 的一部分的支持。

如需进一步阅读,请查看此提交的评论。