嗨,我对 Ruby on Rails 和 Devise 非常陌生,我想知道如何配置 devise 以禁止用户使用已经使用的用户名进行注册。初始配置是不允许在注册期间接收电子邮件,但我希望为我新创建的用户名字段进行相同的配置。我已经加了
config.authentication_keys = [ :username ]
进入我的 devise.rb 文件,但它不能解决我的问题
嗨,我对 Ruby on Rails 和 Devise 非常陌生,我想知道如何配置 devise 以禁止用户使用已经使用的用户名进行注册。初始配置是不允许在注册期间接收电子邮件,但我希望为我新创建的用户名字段进行相同的配置。我已经加了
config.authentication_keys = [ :username ]
进入我的 devise.rb 文件,但它不能解决我的问题
如果需要名称是唯一的,无论大小写,您都需要这样做
validates_uniqueness_of :username, case_sensitive: false
这是假设您不希望一个名为“Bob”的用户和另一个名为“bob”的用户。
此外,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 worker 都是一个进程),那么如果两个进程同时尝试添加“bob”,就会产生竞争条件,然后代码可能会执行,这样第一个 SELECT 不会为它们返回任何结果。然后,他们将几乎同时尝试插入,此时唯一能保存数据完整性的是唯一的数据库索引。
将此添加到 user.rb 中:
validates_uniqueness_of :用户名
来源: http: //guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness