如何按角色为不同用户创建多个视图?
我有一个用户可以有多个角色player
,coach
,guest
。如何按角色为不同用户创建多个视图?
我希望根据登录的用户或查看该配置文件,获得player_profile (profile/8)
的不同视图。
除了在我的视图中写入一串if
语句来检测cancancan
权限,有没有更简单/更理智的方式来尽可能以时尚的方式解决此问题?
要显示基于用户角色的不同视图,可以在控制器中使用一些简单的分支逻辑。让我们以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
模型。
真的没有那么多。
或者您可以简单地利用部分 –
@Deepak Care来说明? – marcamillion
@Deepak没有部分例子的原因是因为OP特别要求“截然不同”视图的示例代码。部分意味着意见大部分与部分意见不同。 – MarsAtomic
可以渲染视图动态地立足于用户的角色:
def show
render "show_#{current_user.role}"
end
,这会使得show_admin
,show_guest
,show_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
希望这帮助。
有趣的潜在答案。感谢你! – marcamillion
取决于不同的意见。如果几乎没有差异,那么在能力上分支就没有问题,但如果视图完全不同,则可以在控制器方法中分支角色/能力并呈现不同的视图。 – MarsAtomic
@MarsAtomic有些稍有不同,但我更关心那些截然不同的。你能告诉我一个在控制器PLZ中分支的例子吗?谢谢! – marcamillion