我的用户可以拥有多个角色player
,coach
,guest
。
我想拥有player_profile (profile/8)
的不同视图,具体取决于登录的用户或查看该个人资料。
除了在我的视图中编写一堆if
语句来检测cancancan
权限之外,还有一种更简单/更明智的方式来尽可能地解决这个问题吗?
答案 0 :(得分:2)
您可以根据用户的角色动态渲染视图:
def show
render "show_#{current_user.role}"
end
这会根据current_user的角色呈现show_admin
,show_guest
,show_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 file
,show.html.erb
文件和role
您User
模型上的属性。
它真的没那么多。