【问题标题】:How do I create multiple views for different users by role?如何按角色为不同用户创建多个视图?
【发布时间】:2016-10-11 04:00:16
【问题描述】:

我有一个用户可以拥有多个角色playercoachguest

我希望根据登录或查看该个人资料的用户对player_profile (profile/8) 有不同的看法。

除了在我的视图中编写一堆if 语句来检测cancancan 权限之外,是否有一种更简单/更理智的方法来以尽可能DRY 的方式解决这个问题?

【问题讨论】:

  • 取决于视图的不同程度。如果差异很少,那么在能力上进行分支是可以的,但如果视图完全不同,您可以在控制器方法中根据角色/能力进行分支并渲染不同的视图。
  • @MarsAtomic 有些略有不同,但我更关心的是那些截然不同的。你能告诉我一个在控制器中分支的例子吗?谢谢!

标签: ruby-on-rails cancan ruby-on-rails-5


【解决方案1】:

您可以根据用户的角色动态呈现视图:

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

这将根据 current_user 的角色呈现 show_adminshow_guestshow_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

希望这会有所帮助。

【讨论】:

  • 有趣的潜在答案。谢谢!
【解决方案2】:

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

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

此示例假定您可以访问 current_user 帮助程序,无论是来自 Devise 或您自己的解决方案、show_admin.html.erb fileshow.html.erb 文件和您的 User 模型上的 role 属性。

其实并没有那么多。

【讨论】:

  • 或者你可以简单地使用partial
  • @Deepak 需要说明吗?
  • @Deepak 没有部分示例的原因是 OP 专门为“截然不同”的视图请求示例代码。部分意味着除了部分中的内容之外,这些视图大部分是相同的。
猜你喜欢
  • 2010-09-29
  • 2011-03-10
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
相关资源
最近更新 更多