我有两种不同的布局,一种是完全自定义的,另一种是自举。对于管理员,我们要呈现引导视图,对于非管理员,我们要正常呈现它。在大多数情况下,这是非常直接的,因为管理员和用户不共享许多视图 - 但有一些。
我最初的想法涉及覆盖render
,以便检查是否存在文件的引导版本。因此,例如,_user.html.erb
和_user.bootstrap.html.erb
将具有引导程序特定的模板。
我不想修改任何控制器,理想情况下,像render 'form'
这样的东西会表现得很聪明并检查是否有_form.bootstrap.html.erb
,如果没有,它会回退到_form.html.erb
}
我的第一次尝试看起来像这样
# I don't think this is the actual method signature of render
def render(options=nil, extra_options, &block)
# if it should render bootstrap and options is a string and there exists a bootstrap version
# set it up to render the bootstrap view
super(options, extra_options, &b)
end
我正在考虑注册一个基本上检查文件是否存在然后使用erb的模板。我还没有取得任何进展。
答案 0 :(得分:0)
我明白了。我就这样做了:
这是在应用程序控制器中设置的,before_filter :render_bootstrap
def render_bootstrap
return unless bootstrap?
new_action = "#{self.action_name}.bootstrap"
has_bs_view = template_exists?(new_action,params[:controller],false) || template_exists?(new_action,params[:controller], true)
if has_bs_view
self.action_name = new_action
end
end
我决定进一步扩展这一点,以便在show.bootstrap.html.erb
之类的视图中,您仍然可以在不render "form"
的情况下使用render "form.bootstrap"
。这是通过覆盖rails render helper完成的。