如何设置具有不同类型用户的Rails应用程序?

时间:2015-05-20 14:57:37

标签: ruby-on-rails authentication login orm architecture

如果我想构建一个包含两种不同类型用户的Rails应用,请假设一种类型称为播放器,另一种类型是所有者 ,对应用程序进行建模的最佳和最强大的方法是什么?

需要考虑的事项:

  • 应该只有一个登录,但是所有者/玩家可以使用不同的注册表单。
  • 所有者可以访问控制面板,但玩家却无法访问。
  • 所有者无法共享任何 Players 功能,但两者都需要能够执行登录/注册。
  • 使用Devise,所以请不要建议。

我考虑过的不同方法:

  • 使用cancancan gem ,但是似乎 strong>想要创建一个用户/管理层级方法,而不是如果你是一个播放器,那么你可以看到这些页面并执行这些操作,但是所有者不能,反之亦然。几乎就像将应用程序分成两部分一样。 cancancan似乎会将所有者视为"具有额外权限的玩家",而不是完全不同的权限。

  • 使用单独的登录和注册表单创建单独的模型,这似乎是一场等待发生的灾难。 Players 表与 Owners 表之间的一个小混淆,特别是主键,这将是一个人们可能最终登录到错误的世界帐户。

  • 帐户模型创建多态或has_one关系,到目前为止,这似乎是最好的方法。如果我创建了一个多态帐户模型,我可以存储不同类型的播放器 / 所有者,但是如何比较所有类型的登录凭据?

我一直试图在这个问题上找到关于如何将其映射出来的事情,并且很惊讶没有找到关于如何在不使用Devise 的情况下执行此操作的信息。如果有人有任何良好的链接,他们可以指出我也解决这个问题(没有设计),请留下你的答案!感谢。

2 个答案:

答案 0 :(得分:0)

我建议一个User类,其type属性确定用户是Player还是Owner(单表继承)。这样您就可以将注册逻辑保存在一个位置,但可以根据用户的类自定义表单。

必须有cancancan的替代方案来帮助您做您想做的事情,或者您可以自己实施帮助:

def can_access_control_panel?
  current_user.is_a?(Owner)
end

答案 1 :(得分:0)

您必须有办法将一个用户与另一个用户分开。一种方法是向User表添加属性,以便您可以调用current_user.role,它将返回"owner"或返回"player"

我过去曾使用Pundit gem。它允许您定义允许当前用户访问哪些控制器操作。因此,在为应用程序创建资源时,可以添加一个策略,指定允许该给定资源的用户。这是应用程序的repo

answer可能会对您有所帮助。