2012-10-19 51 views
1

我想验证两列在我的用户模型中是唯一的。我搜索谷歌和从我的理解下面的代码将无法正常工作:验证两列的唯一性

validates :login, :uniqueness=>true 
validates :email, :uniqueness=>true 

在我的情况下这样做,将验证电子邮件的唯一性,但不会验证登录用户的唯一。我设置登录在数据库上必须是唯一的。但是,如果它已经存在,所有将会产生的运行时错误。我不想在生产中出现这种错误,因为这会导致500个内部服务器错误,用户不会理解。

关于如何验证这两个字段的唯一性的任何想法?

认证时使用:

  • 惨惨
  • 设计
  • 设计Invitable

更新:

从我可以告诉这个问题是原因d由Devise,特别是验证电子邮件和密码的validatable模块。

更新2:

从设计卸下可验证模块将导致既不唯一性检查。

更新3:

看来,遗赠是不是造成问题的原因。相反,名为Devise Invitable的宝石是。删除这个宝石会导致验证被触发。它也似乎是这个宝石试图强制电子邮件领域的验证。由于这种宝石的性质,它是有道理的,但不应该被阻挡。

+1

您使用的是验证宝石吗?如果是这样,那可能会引起验证。这应该起作用,所以上游有某处冲突。 – JohnMetta

+0

@JohnMetta我正在使用CanCan与Devise –

+0

你所描述的应该工作。但你也可以尝试“validates_uniqueness_of:login,:email” - 这个运行时错误是怎么样的?您正在使用哪种版本的导轨? – tmaximini

回答

0

的问题是用叔他devise_invitable创业板。在设备初始化程序中,我必须设置

config.validate_on_invite = true 

确保验证已执行,默认值为false。我也必须删除设计验证模块。

9

应该可以通过scope来完成,并添加到devise的默认验证中。

对于导轨3个版本:

validates :email, :uniqueness => {:scope => :login} 

价:

+0

当我尝试这个解决方案时,我得到'''救援块中的验证':未知 验证器:'ScopeValidator'(ArgumentError)'''当试图启动rails服务器时。 –

+0

验证,我也得到了同样的错误。我的错;我已经给出了解决方案的Rails 2版本。我更新了解决方案的Rails 3版本的答案。验证它在我身边运作。属性的顺序很重要。我给出的解决方案验证了新电子邮件与现有登录结合的独特性。 –

+0

尽管您的解决方案可能有效。我认为devise_invitable存在潜在的问题,删除此gem会导致正确的行为,但会削弱应用程序所需的某些功能(即gem所要做的)。 –

0

该代码在Rails 3.2.8上运行得非常好。我测试过它...

也许您的宝石存在一些问题...