我正在使用
acts_as_tenant gem管理多租户,而我正在使用设计来管理用户.
我只为租户设置了用户模型和帐户模型.
我可以针对多个租户创建用户 – 这一切都正常工作除了当我尝试使用相同的电子邮件创建两个用户对不同的租户ID时,我得到了一个单一性错误.
我正在使用所述的validates_uniqueness_to_tenant选项.
用户模型
class User < ActiveRecord::Base # Include default devise modules. Others available are: # :token_authenticatable,:confirmable,# :lockable,:timeoutable and :omniauthable devise :database_authenticatable,:registerable,:recoverable,:rememberable,:trackable,:validatable attr_accessible :email,:password,:password_confirmation,:remember_me acts_as_tenant(:account) validates_uniqueness_to_tenant :email end
帐户模型
class Account < ActiveRecord::Base attr_accessible :name end
应用控制器
class ApplicationController < ActionController::Base set_current_tenant_by_subdomain(:account,:subdomain) protect_from_forgery end
看起来它应该基于acts_as_tenant中的所有文档工作,我是否需要在设计级别覆盖某些内容?
编辑:经过一些头疼和一点休息后,问题是我相信,因为默认情况下,Devise为电子邮件列添加了一个唯一索引.
这显然不会影响act_as_tenant想要做的事情……
我会尝试删除索引,看看Devise是否呕吐.
编辑2:好的,现在已经正式放弃了.我对主站点进行了手动滚动身份验证,这与acts_as_tenant一起正常运行.
我只能假设在某个层面上acts_as_tenant和Devise之间存在一些不兼容性 – 除了我在这个阶段找到它.
解决方法
唯一的方法是从设计中删除validatable模块并运行您自己的验证,如下所示:
class User < ActiveRecord::Base acts_as_tenant :account attr_accessible :email,:remember_me #remove :validatable devise :database_authenticatable,:trackable #run own validations #I've omitted any emailformatting checks for clarity's sake. validates :email,presence: true,uniqueness: { scope: :account_id,case_sensitive: false } validates :password,length: { :in => 6..20 },:if => :password_required? protected # copied from validatable module def password_required? !persisted? || !password.nil? || !password_confirmation.nil? end end