我知道这已被问了很多次,但我找不到一个好的答案。
我将在我的应用程序中同时拥有商家和用户。两者的表结构几乎相同,所以我更喜欢使用一个表和一个名为“is_merchant”的布尔字段。
我更喜欢单独的注册页面(users / new和merchants / new),但希望为所有用户共享相同的登录页面(/ login)。
我非常想使用Devise进行身份验证。但是,使用Devise这种类型的系统SEEMS很难实现。是这样的吗?我可以看一下哪些好的指南或提示?如果Devise不是最好的解决方案,那么对另一个身份验证系统的任何建议(注意:希望以后能够轻松添加Facebook身份验证)?
非常感谢提前!
答案 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 %>