ruby-on-rails - 使用 Devise 和 STI 设计具有多种用户类型的 Rails 应用程序

标签 ruby-on-rails devise single-table-inheritance sti

我对 Rails 比较陌生,到目前为止只编写了一个应用程序。我在该应用程序中使用 Devise 进行身份验证。现在我开始我的第二个,我必须更多地考虑身份验证,因为我有很多用户类型,而不是我的第一个应用程序中的单一用户类型。

我一直在研究这些问题,因此当我将代码放入金属(或云)时,我可以在考虑清晰的设计的情况下这样做。

到目前为止,我发现这篇文章最有用:

  • devise and multiple "user" models

  • 背景

    我正在创建一个在线市场,客户可以在其中从供应商处订购东西。

    我计划创建以下用户类型:
  • 客户:访问市场并订购东西
  • 提供者:在市场上创建东西并处理订单
  • 员工:为供应商工作
  • super 管理员:管理站点
  • 管理员:管理由 super 管理员委派的站点部分

  • 以下字段是我确定在上述三种用户类型之间共享的字段:
  • 电子邮件地址(用作登录 ID)
  • 手机号码

  • 每个用户类型都有不同的字段(每个 4 - 6 个附加字段)。

    客户和提供商将自行注册。员工和管理员将分别由提供者和 super 管理员注册。

    员工将与提供者相关联。我不认为一名员工与多个提供者相关联。

    我也没有预见到需要具有多个角色的用户。

    我的计划

    在对选项进行了一些研究后,我决定了以下内容:

    我将创建三种不同的用户模型:
  • 客户
  • 提供商
  • super 管理员

  • 在我看来,这些都是真正不同的用户,他们将与应用程序的不同部分进行交互,所以感觉很干净。根据我的研究,这种方法还允许我为每个用户类别完全自定义注册程序。例如,我可以允许客户使用他们的 Facebook 帐户注册(使用 OmniAuth),但不能将此选项扩展到我的提供商。当然, super 管理员根本无法注册。我知道每个用户都有单独的登录页面,这对我来说不是问题(实际上是可取的)。

    拥有不同的模型,尤其是对于 Admin 的模型,还允许我以后轻松重构,以防我确实需要实现其他角色。

    问题

    上面的设计是我能做到的那么简单吗?没有任何作战计划能在与敌人的接触中幸存下来。但我希望 Rails 是我的 friend :) 所以在纸面上,我的计划对我来说似乎很简单。有什么我遗漏的东西会使它的实现比纸面上看起来更复杂吗?

    此外,即使我已经设计了上述计划(双关语),我也愿意接受其他建议。例如,我是否有任何理由想要对所有模型进行 STI(有一个用户模型,我的所有其他模型都继承自该模型)?

    谢谢阅读!

    最佳答案

    Rails Cast 有一个非常可靠的解决方案来至少处理您的解决方案引入的一些复杂性。 Bates 向 User 模型引入了一个角色属性,该属性封装了用户具有的角色(或角色)。他将此与 gem CanCan 结合起来,以决定哪个角色可以执行哪些操作。

    看看这个 http://railscasts.com/episodes/192-authorization-with-cancan?view=asciicast

    首先看看他是如何设置和获取角色属性的,然后看看他是如何将其与 CanCan 耦合的。

    关于ruby-on-rails - 使用 Devise 和 STI 设计具有多种用户类型的 Rails 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20872007/

    相关文章:

    ruby-on-rails - 使用 Devise (rails) 进行 LDAP 身份验证的 ETIMEDOUT

    ruby-on-rails - 从多个不同的 Rails 模型创建 "feeds"

    ruby-on-rails - 将外部 .js 文件添加到新的 Rails 6 Web 应用程序

    ruby-on-rails - 通过 JSON/XML 将二进制数据发送到 (Rails) RESTful 端点?

    ruby-on-rails - 带参数的 Rails redirect_to

    css - 如何在 ruby​​ on rails 上基于 Bootstrap 的导航栏中显示图像

    ruby-on-rails - 使用 Rails 3 + Devise + Jquery Mobile 登录失败没有给用户反馈

    ruby-on-rails - 在 ruby​​ on rails 中禁用除 admin 之外的所有登录

    ruby-on-rails - Rails 嵌套属性/inverse_of 和 STI

    entity-framework - 使用 TPT 的 EF 继承 - 如何指定外键列名称?