问题描述
|
我在Rails应用程序中使用devise进行身份验证,并且我的应用程序可以具有许多子域。
目前,它使用电子邮件作为身份验证,并且电子邮件对于整个应用程序应该是唯一的。
现在有什么方法可以将电子邮件地址的唯一性限定在子域中,而不是整个应用程序中?
我试过了:
validates_uniqueness_of :email,:scope => :account_id
但是没有用。在注册新用户时,它仍然寻求整个应用程序而不是特定子域的电子邮件的唯一性。
任何帮助将不胜感激。
解决方法
好吧,我这样做了。
在devise.rb中将config.authentication_keys编辑为
config.authentication_keys = [ :login,:account_id ]
我还创建了隐藏字段以在登录表单中包含account_id
<%= f.hidden_field :account_id,:value => @account.id %>
在这里@account拥有与当前子域相关的帐户。
并在user.rb中添加以下受保护的方法以覆盖find_for_database_authentication类方法
protected
def self.find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
login = conditions.delete(:login)
account_id = conditions.delete(:account_id)
where(conditions).where([\"lower(username) = :value OR lower(email) = :value\",{ :value => login.downcase }]).where(\"account_id = ?\",account_id).first
end
如果有更好的解决方案,请随时发表评论。
干杯!
, 您如何保存用户,是否在尝试保存之前在用户模型上设置了帐户?如果不是,那么您将范围限定为nil的account_id-因此看起来好像没有作用域。