在设计轨道中将电子邮件限定到子域

问题描述

| 我在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-因此看起来好像没有作用域。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...