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

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

问题描述:

我有一个用户可以有多个角色player,coach,guest如何按角色为不同用户创建多个视图?

我希望根据登录的用户或查看该配置文件,获得player_profile (profile/8)的不同视图。

除了在我的视图中写入一串if语句来检测cancancan权限,有没有更简单/更理智的方式来尽可能以时尚的方式解决此问题?

+0

取决于不同的意见。如果几乎没有差异,那么在能力上分支就没有问题,但如果视图完全不同,则可以在控制器方法中分支角色/能力并呈现不同的视图。 – MarsAtomic

+0

@MarsAtomic有些稍有不同,但我更关心那些截然不同的。你能告诉我一个在控制器PLZ中分支的例子吗?谢谢! – marcamillion

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

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

这个例子假设你有机会到current_user帮手,无论是从类似设计或自己的解决方案,一个show_admin.html.erb file,一个show.html.erb文件,并在role属性您User模型。

真的没有那么多。

+0

或者您可以简单地利用部分 –

+0

@Deepak Care来说明? – marcamillion

+0

@Deepak没有部分例子的原因是因为OP特别要求“截然不同”视图的示例代码。部分意味着意见大部分与部分意见不同。 – MarsAtomic

可以渲染视图动态地立足于用户的角色:

def show 
    render "show_#{current_user.role}" 
end 

,这会使得show_adminshow_guestshow_xxx底座上CURRENT_USER的作用。但它要求您创建所有这些视图,并且在未来添加一个可以访问此路线的新角色时应该注意。

如果以上将是一个问题,但如果该视图渲染之前存在检查的方式:

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 

希望这帮助。

+0

有趣的潜在答案。感谢你! – marcamillion