Ruby On Rails设计:如何在注册期间避免重复的用户名

时间:2013-03-11 20:22:08

标签: ruby-on-rails devise

您好我是Ruby on Rails和Devise的新手,我想知道如何配置设备以禁止用户注册已经使用的用户名。初始配置是在注册期间不允许收集电子邮件,但我希望我新创建的用户名字段具有相同的配置。我已经添加了

config.authentication_keys = [ :username ]

进入我的devise.rb文件,但它没有解决我的问题

2 个答案:

答案 0 :(得分:2)

将其添加到user.rb:

  

validates_uniqueness_of:用户名

来源:http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness

答案 1 :(得分:2)

如果需要名称是唯一的,无论你需要这样做

validates_uniqueness_of :username, case_sensitive: false

这假设您不希望一个名为“Bob”的用户和另一个名为“bob”的用户。

此外,当Rails进行检查时,由于竞争条件,Rails无法可靠地验证属性的唯一性。您必须添加唯一的数据库索引才能确保数据的完整性。

#postgresql
execute 'CREATE UNIQUE INDEX ON USERS lower(username);'

Rails无法进行唯一验证的原因是因为它进行了如下验证:

SELECT 1 FROM users WHERE lower(username) = 'bob'
# if nothing found
INSERT INTO USERS ...

但是如果有多个Rails进程(几乎总是在生产中)(例如,每个Unicorn工作者都是一个进程),那么就会创建一个竞争条件,如果两个进程试图在其中添加'bob'同时,代码可以执行,使得第一个SELECT不返回它们的结果。然后他们会同时尝试INSERT,并且唯一可以保存数据完整性的是唯一的数据库索引。