ruby-on-rails-3 – 使用rails 3中的devise和acts_as_tenant的用户的唯一性

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – 使用rails 3中的devise和acts_as_tenant的用户的唯一性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 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

猜你在找的Ruby相关文章