有没有办法在不使用条件的情况下基于当前用户呈现不同的模板

时间:2013-02-04 17:24:02

标签: ruby-on-rails

我有两种不同的布局,一种是完全自定义的,另一种是自举。对于管理员,我们要呈现引导视图,对于非管理员,我们要正常呈现它。在大多数情况下,这是非常直接的,因为管理员和用户不共享许多视图 - 但有一些。

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

1 个答案:

答案 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完成的。