我有一个可以具有多个角色的用户, player
, coach
, guest
。
我想根据已登录或查看该个人资料的用户而具有不同的player_profile (profile/8)
视图。
除了在我的视图中编写一堆if
语句以检测cancancan
权限之外,还有没有更简单/更合理的方式以尽可能干的方式解决此问题?
您可以根据用户角色动态呈现视图:
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
希望这可以帮助。
要根据用户角色显示不同的视图,可以在控制器中采用一些简单的分支逻辑。 让我们以show
动作为例:
def show
if current_user.role == 'admin'
render 'show_admin'
else
render 'show'
end
end
此示例假定您可以通过Devise或您自己的解决方案访问current_user
帮助程序,可以访问User
模型上的show_admin.html.erb file
, show.html.erb
文件和role
属性。
其实没有那么多。