最近在写一个多租户的站群系统:https://github.com/wuwx/MultiTenantCMS,在单站点的 CMS 系统中,都会有很强烈的模板定制需求,在站群中,主站会托管很多二级网站,这些二级网站同样会有不同的模板定制需求,并且需要在多种模板之间能够灵活切换,我们对网站模板的切换,在 MVC 中架构,相当于提供了多种 View 层可供选择,选择不同的 View,就可以让数据以不同的方式展现出来
在 Rails 应用中,view 层包含布局,视图,片段等,在一个默认应用中,这些 view 都会被保存在 apps/views 目录中,如果我们使用过 devise 等第三方 gem,会发现这些 gem 天生自带 view,并且默认不会侵入到 apps/views 目录中,但系统却可以很好地渲染,原因是 Rails 在搜索渲染的 view 并不单单在应用自身的 apps/views 目录内进行查找,他会在预先定义好的一个 view 目录的列表中进行挨个目录匹配,匹配到可用的视图,就可以进行渲染展现了。
根据 Rails 对 View 渲染的顺序特点,我们就可以在 View 渲染之前,增加我们的风格路径
before_action do |controller|
@theme = 'flat-ui'
controller.prepend_view_path "app/themes/#{@theme}/views"
end
这样,我们就可以让 Rails 先去 flat-ui 目录去搜索是否有合适的可以渲染的 view,如果存在的话,就先渲染 flat-ui 下的 view,如果没有的话,就会回退到 app/views 下去查找。
当然我们还可以再增加一点技巧,比如先让应用搜索 app/themes/flat-ui,再搜索 app/themes/default,最后才搜索 app/views
before_action do |controller|
@theme = 'flat-ui'
controller.prepend_view_path "app/themes/default/views"
controller.prepend_view_path "app/themes/#{@theme}/views"
end
如果不愿意手动插代码,也有现成的 gem 支持这样多模板的选择,地址是:https://rubygems.org/gems/themes_on_rails 具体功能和用法可以看官方的主页,这里就不再多做介绍了:)
最后,期待大家对 https://github.com/wuwx/MultiTenantCMS 参与与关注:)