如何按角色为不同用户创建多个视图?

时间:2016-10-11 04:00:16

标签: ruby-on-rails cancan ruby-on-rails-5

我的用户可以拥有多个角色playercoachguest

我想拥有player_profile (profile/8)的不同视图,具体取决于登录的用户或查看该个人资料。

除了在我的视图中编写一堆if语句来检测cancancan权限之外,还有一种更简单/更明智的方式来尽可能地解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您可以根据用户的角色动态渲染视图:

def show
  render "show_#{current_user.role}"
end

这会根据current_user的角色呈现show_adminshow_guestshow_xxx。但它要求您创建所有这些视图,并在将来添加可以访问该路径的新角色时注意。

如果上述问题,可以在渲染之前检查视图是否存在:

lookup_context.exists?(dynamic_template_name)

您可以创建一个方法来处理它:

def show
  render view_for_user(:show)
end

private

# This will render `show_guest` if not user is logged in. Otherwise it will 
# checks if the requested view exists or show a default one (view_name)

def view_for_user(view_name)
  return "#{view_name}_guest" unless current_user

  dynamic_template_name = "#{view_name}_#{current_user.role}"

  lookup_context.exists?(dynamic_template_name) ? dynamic_template_name : view_name
end

希望这有帮助。

答案 1 :(得分:1)

要根据用户角色显示不同的视图,您可以在控制器中使用一些简单的分支逻辑。我们以show行为为例:

def show
  if current_user.role == 'admin'
    render 'show_admin'
  else
    render 'show'
  end
end

此示例假定您可以访问current_user帮助程序,可以使用Devise或您自己的解决方案,show_admin.html.erb fileshow.html.erb文件和roleUser模型上的属性。

它真的没那么多。