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

How do I create multiple views for different users by role?

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

我想要 player_profile (profile/8) 根据登录或查看该配置文件的用户的不同视图。

除了在我的视图中编写一堆 if 语句来检测 cancancan 权限之外,是否有一种 simpler/more 理智的方法来尽可能以 DRY 方式解决这个问题?

要根据用户角色显示不同的视图,您可以在控制器中使用一些简单的分支逻辑。我们以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 文件和 role 属性 User 模型。

其实并没有那么多。

您可以根据用户的角色动态呈现视图:

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

希望这对您有所帮助。