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

问题描述 投票:0回答:2

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

我想根据已登录或查看该个人资料的用户而具有不同的player_profile (profile/8)视图。

除了在我的视图中编写一堆if语句以检测cancancan权限之外,还有没有更简单/更合理的方式以尽可能干的方式解决此问题?

ruby-on-rails cancan ruby-on-rails-5
2个回答
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
投票

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

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

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

其实没有那么多。

© www.soinside.com 2019 - 2024. All rights reserved.