使用Devise和Rails 4为多种类型的用户建模

时间:2014-05-14 15:22:28

标签: ruby-on-rails ruby devise cancan sti

我有3种类型的“用户”

商店 提供商 客户

最后2位用户将拥有类似的属性,例如

名字 姓  等等

Shop用户类型在类型之间的对比度最大。

就行为而言,尽管提供商和商店将固有许多客户行为,但它们都将完全不同。

在我研究过的时候,行为似乎可以用CanCan处理。

我现在正在尝试如何验证这些类型。

我看过STI模型,但我无法掌握这些额外属性的位置。

我的心理模型如下:

用户是表格和模型 这些类型是从中继承的抽象模型。

所以我想知道,如何为商店类型添加商家地址等属性?

或者用户表是否有一个名为Type的列,该类型是否与这些类型表相关联?在类型表中是额外的属性吗?

2 个答案:

答案 0 :(得分:2)

不要费心把Devise带进去;设计适用于身份验证 而不是 授权身份验证正在确定访问您网站的用户是否是您认为的人,例如登录。授权决定是否允许用户执行某种排序动作,比如创建一个新帖子。

你想要做的是拥有某种系统,为普通用户分配三种不同的类型; CanCan会做那样的事情。自行完成此操作的一种方法是使用基于权限号码的系统。我们假设普通用户的权限级别为100,商店的级别为50,提供商的级别为25。使用此系统,您可以确定用户可以执行的操作,而无需单独执行模型,这将使​​您的架构不必要地复杂化。以下是UserController:

的示例
def show
  if current_user.permissions == 100
     render "customer_show"
  elsif current_user.permissions == 50
     render "shop_show"
  else
     render "provider_show"
  end
end

最简单的方法是在用户的表中添加一个名为权限的表,默认情况下在创建新行时会说100。这就是迁移的样子:

def change
  add_column :users, :permissions, :integer, default: 100
end

至于身份验证,请不要担心。让设计做到这一点;每个用户,无论是什么类型,都会以相同的方式登录和注册,也许每个用户都有一个单独的表单,每个用户都有一个隐藏字段来设置该特定用户的权限级别。

答案 1 :(得分:0)

我知道我已经迟到了,但我正在为未来的SO搜索者提出这个问题。您可以使用Devise授权操作。如果您为“买方”和“买方”设计模型'卖家'你可以添加'buyer_signed_in?'无论您采取何种行动,您都希望买家能够做到。您还可以执行更具体的基于角色的授权 - 请查看Devise' page

总而言之,Tsiege的解决方案听起来很有趣。如果您有任何成功,请告诉我们!