Rails Rails 3 组织分割 routes

suffering · 2014年11月28日 · 最后由 hammer 回复于 2014年11月29日 · 3272 次阅读

项目中 routes 太多太乱时,仅仅备注的话是很乱的,因此可以考虑将之分组之分割到不同的文件里。

解决的思路如下:

  1. 在 config 下新建 routes 文件夹
  2. 将 routes.rb 拆分放到不同的文件夹内
  3. 更改 application.rb 的 load path

场景

#config/routes.rb
YourApppic::Application.routes.draw do
  resources :products
  resources :categories
  namespace :admin do
    resources :products
  end
  get 'welcome/index'
end

创建并拆分文件

cd path/to/your_app/config
mkdir routes
touch admin_routes.rb
touch data_routes.rb
touch none_restful_routes.rb

而后变成:

#config/admin_routes.rb
YourApppic::Application.routes.draw do
  namespace :admin do
    resources :products
  end
end
#config/routes/data_routes.rb
YourApppic::Application.routes.draw do
  resources :products
  resources :categories
end
#config/routes/none_restful_routes.rb
YourApppic::Application.routes.draw do
  get 'welcome/index'
end

修改 application.rb

config.paths["config/routes"] += Dir[Rails.root.join("config/routes/*.rb")]`

重启项目,一切 ok .

考虑 routes override

如果你的 routes 非常依赖顺序。就不要使用 config.paths["config/routes"] += Dir[Rails.root.join("config/routes/*.rb")] 可以考虑指定顺序加载分割后的文件:

# 逐个加载
config.paths.config.routes << File.join(Rails.root, "config/routes/none_restful_routes.rb")
config.paths.config.routes << File.join(Rails.root, "config/routes/admin_routes.rb")
config.paths.config.routes << File.join(Rails.root, "config/routes/data_routes.rb")

# alphabetical 排序加载
config.paths["config/routes"] += Dir[Rails.root.join("config/routes/*.rb")].sort
# 这个需要重命名下文件, 如 0_none_restful_routes.rb, 1_admin_routes.rb, 2_data_routes.rb 这种做法.

参考

http://rails-bestpractices.com/posts/73-split-route-namespaces-into-different-files

http://stackoverflow.com/questions/7303660/splitting-routes-file-into-multiple-files

other

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

draw :admin

需要 登录 后方可回复, 如果你还没有账号请 注册新账号