您好我是Ruby on Rails和Devise的新手,我想知道如何配置设备以禁止用户注册已经使用的用户名。初始配置是在注册期间不允许收集电子邮件,但我希望我新创建的用户名字段具有相同的配置。我已经添加了
config.authentication_keys = [ :username ]
进入我的devise.rb文件,但它没有解决我的问题
答案 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,并且唯一可以保存数据完整性的是唯一的数据库索引。