使用两种类似用户的设计

时间:2011-02-01 14:34:09

标签: ruby-on-rails authentication architecture devise single-table-inheritance

我知道这已被问了很多次,但我找不到一个好的答案。

我将在我的应用程序中同时拥有商家和用户。两者的表结构几乎相同,所以我更喜欢使用一个表和一个名为“is_merchant”的布尔字段。

我更喜欢单独的注册页面(users / new和merchants / new),但希望为所有用户共享相同的登录页面(/ login)。

我非常想使用Devise进行身份验证。但是,使用Devise这种类型的系统SEEMS很难实现。是这样的吗?我可以看一下哪些好的指南或提示?如果Devise不是最好的解决方案,那么对另一个身份验证系统的任何建议(注意:希望以后能够轻松添加Facebook身份验证)?

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

您是否考虑过使用角色?你可以使用康康宝石。你可能想要的不仅仅是“is_merchant”。例如,“is_admin”怎么办?那时你最好使用角色。 https://github.com/ryanb/cancan

您稍后可以使用Omni-auth添加Facebook身份验证。

为了清楚起见,Devise用于包含您自己的身份验证系统,而Omni-auth用于通过Facebook,Twitter等网站进行身份验证。

答案 1 :(得分:0)

您还可以在用户模型中删除设计的:validatable模块规范,并添加validates_uniqueness_of并将:scope设置为:is_merchant。这允许您使用ActiveRecord验证方法而不是Devise's。

:scope中使用validates_uniqueness_of可以验证多列的唯一性。

<强> user.rb:

class User < ActiveRecord::Base

  # ...

  validates_uniqueness_of :email, :scope => :is_merchant

  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable #, :validatable <- removed

  # ...

end

在新用户注册视图中,在注册表单中指定is_merchant值。

<强> new.html.erb

<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>

  <%=f.hidden_field :is_merchant, :value => 1 %> # used hidden for my implementation

  # ... other inputs

<% end %>