1

我有两种不同的布局,一种是完全自定义的,另一种是引导的。对于管理员,我们想要渲染一个引导视图,对于非管理员,我们正常渲染它。在大多数情况下,这很简单,因为管理员和用户不会共享很多视图 - 但有一些。

我最初的想法涉及覆盖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。我还没有在这方面取得任何进展。

4

1 回答 1

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 渲染助手来完成的。

于 2013-02-06T21:03:16.740 回答