Rails 项目越写越大,路由自然也就越来越多,有的路由针对客户端的,有的是针对管理后台的,有的是针对代理的等等。Rails 默认只是提供了一个地方config/routes.rb
来设置路由,整的这个文件很长,个人觉得这不是很方便管理。
为什么会有拆分路由的这个想法呢?因为我最早接触的是 Python 的 web 框架Django
,它默认是可以将路由分成不同文件来设置的。
最开始我只是在一个项目中简单的实现了将路由拆分,但每次新建项目后要想让路由可以分成不同的文件来设置,总要粘贴复制老项目的配置,因此就有了这个小轮子------一个可以把 Rails 路由文件按功能分成几个文件来写的小轮子。
添加下面这行到 Gemfile:
gem 'wow-route', :git => 'https://github.com/winterbang/wow-route.git'
然后执行下面的命令
$ bundle
执行下面的命令在config/routes
目录中生成admin.rb
:
$ rails g wow:route admin
如果执行rails g wow:route api
则生成api.rb
,
然后可以像编辑config/routes.rb
文件一样在admin.rb
中使用 Rails 路由的语法糖来设置路由。
例如:
namespace :admin do
resources :posts, :comments
end
欢迎大家挑错指正。
为什么要用 Gem.
class ActionDispatch::Routing::Mapper
def draw(routes_name)
instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
end
end
为了使用方便啊,总部能每次新建项目都去复制粘贴吧。还有就是这么写不是很好,开发时如果更改路由需要重启才能重新加载,但这个 gem 把这些都做了
ls 在写法上确实不太好,只是想先实现了,有什么好的方法希望欢迎赐教😄。
至于说类似instance_eval
这样的方法好不好,能不能轻易用,如果没有找到更合适的实现方案也没有什么轻易就用
这么一说了,既然有存在这个方法就是可以用的,不用纠结要不要用,实现是第一步😀。
我之前是在 Gitlab 上面看到这样的做法:https://gitlab.com/gitlab-org/gitlab-ce/blob/master/config/initializers/routing_draw.rb#L5
是的,所以我在 initializer 监听文件的更改,就和你 Gem 里面的实现差不多。这样的话每次更改路由代码都不需要重启服务了。
额?我这里用的Rails 5.1.5
还是不可以---把路由文件放在routes
目录里,用 draw 方法去加载。可能实现上有不同吧。
修改config/routes.rb
的文件是会重新加载的,但是修改config/routes/
文件夹下面的路由应该是不行的。