我正在为负责用户注册的模型添加唯一性验证。用户名应是唯一性。几天前我在测试时创建了一个用户,我们称之为"example-guy"。然后我从脚手架用户界面中删除了他,现在当尝试将新用户注册为"example-guy"时,它会返回该名称已被占用。那么,如何在不恢复到其"出生状态"的情况下从数据库中解决此问题,并修改控制器以实际销毁表条目呢?
或者,也许 Rails 正在跟踪写入数据库的内容,即使在销毁之后也是如此?
我使用全身份验证身份,用户模型:
class User < ActiveRecord::Base
attr_accessible :name, :provider, :uid, :email
# This is a class method, callable from SessionsController
# hence the "User."
def User.create_with_omniauth(auth)
user = User.new()
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["info"]["name"]
# ADD EMAIL
user.email = auth["info"]["email"]
user.save
return user
end
end
用户控制器的销毁功能:
# DELETE /users/1
# DELETE /users/1.json
def destroy
@user = User.find(params[:id])
@user.destroy
respond_to do |format|
format.html { redirect_to users_url }
format.json { head :no_content }
end
end
end
验证是使用从 omniauth 的活动记录继承的"身份"模型进行的:
class Identity < OmniAuth::Identity::Models::ActiveRecord
attr_accessible :email, :name, :password_digest, :password, :password_confirmation
#attr_accessible :email, :name, :password_digest :password, :password confirmation
validates_presence_of :name
validates_uniqueness_of :name
validates_length_of :name, :in => 6..24
validates_format_of :name, :with => /^[a-z]+$/
validate :name_blacklist
validates_uniqueness_of :email, :case_sensitive => false
validates_format_of :email,
:with => /A([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})Z/i,
:message => "doesn't look like a proper email address"
#validates_presence_of :password, on: :create
#validates_presence_of :password_confirmation
validates_length_of :password, :in => 6..24
def name_blacklist
unless self.name.blank? then
case self.name
when "user", "photo", "photos",
"application", "sessions",
"identities", "home"
self.errors.add(:name, "prohibited")
end
end
end
end
身份控制管理注册表发送到全身份验证并调用new.html.erb:
class IdentitiesController < ApplicationController
def new
@identity = env['omniauth.identity']
end
end
提前谢谢。
完全确定是什么导致了这个问题,但我遇到了类似的问题,但电子邮件地址是基于 Devise 的用户。
我想在不同的用户上重复使用相同的电子邮件。我将原始用户更改为其他电子邮件,但是当我尝试使用"现在唯一"电子邮件更新第二个用户时,它未能通过唯一验证。
对该电子邮件的用户的查询未返回任何结果。
它似乎与唯一性约束的缓存有关,因为在删除电子邮件地址后重新启动服务器可以解决问题。