如何按角色为不同用户创建多个视图?
How do I create multiple views for different users by role?
我有一个可以拥有多个角色的用户 player
、coach
、guest
。
我想要 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 file
、show.html.erb
文件和 role
属性 User
模型。
其实并没有那么多。
您可以根据用户的角色动态呈现视图:
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
希望这对您有所帮助。
我有一个可以拥有多个角色的用户 player
、coach
、guest
。
我想要 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 file
、show.html.erb
文件和 role
属性 User
模型。
其实并没有那么多。
您可以根据用户的角色动态呈现视图:
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
希望这对您有所帮助。