MySQL: 日志说记录已经存在

MySQL: Log says record already exists

我目前正在为一个项目开发注册表单。当用户单击 submit 按钮时,控制器检查是否有任何字段为空,然后检查其中一个字段 (cedula) 是否为空一个整数,最后,它检查输入的 cedula 是否已经在数据库中。如果不是,那么它将继续创建新记录并将其存储在数据库中,如下所示:

app.rb

post '/signup' do
if params[:nombre].blank? || params[:cedula].blank? || params[:password].blank?
    redirect './signup', :error => "Por favor, complete todos los campos."
elsif params[:cedula].is_a?(Integer)
    redirect './signup', :error => "Cédula inválida, intente nuevamente."
elsif User.select(:cedula).exists?
    redirect './signup', :error => "La cédula #{params[:cedula]} ya se encuentra en uso. Intente nuevamente."
else
    password_salt = BCrypt::Engine.generate_salt
    password_hash = BCrypt::Engine.hash_secret(params[:password], password_salt)

    @usuarios = User.new(nombreUsuario: params[:nombre],
    cedulaUsuario: params[:cedula], passwordUsuario: password_hash,
    nivelAcceso: params[:rol])

    if @usuarios.save
        redirect './signup', :notice => "Usuario creado exitosamente."
    else
        redirect './signup', :error => "Ha ocurrido un error, intente nuevamente."
    end
end
end

如果输入的 cedula 已在数据库中,页面将重新加载并显示一条闪现消息,指示用户它已在使用中。问题是,无论用户输入什么值,指示注册不成功的闪现消息总是会出现。如果 table 完全为空,我只能将一个用户存储到数据库中,否则,我无法存储。

在唯一一次成功插入后,发送到数据库的查询如下所示:

日志

127.0.0.1 - - [01/Aug/2015:22:01:21 -0430] "GET /signup HTTP/1.1" 200 1294 0.0032
D, [2015-08-01T22:01:35.057431 #14779] DEBUG -- :   User Exists (0.3ms)  SELECT  1 AS one FROM `usuarios` LIMIT 1
127.0.0.1 - - [01/Aug/2015:22:01:35 -0430] "POST /signup HTTP/1.1" 303 - 0.0032
127.0.0.1 - - [01/Aug/2015:22:01:35 -0430] "GET /signup HTTP/1.1" 200 1329 0.0034

我不清楚为什么 "SELECT 1 AS one FROM usuarios LIMIT 1" 被发送到服务器。我已经根据 QueryMethods and FinderMethods 尝试了多次查询,但到目前为止都无济于事。

如有任何帮助,我们将不胜感激!

提前致谢。

我认为您在以下位置错误地使用了 select 方法:

elsif User.select(:cedula).exists?
  redirect './signup', :error => "La cédula #{params[:cedula]} ya se encuentra en uso. Intente nuevamente."

根据文档,return 是一个关系对象,所以如果有任何用户,那么 #exists? 将 return truehttp://apidock.com/rails/ActiveRecord/QueryMethods/select

如果您想检查该 cedula 是否已存在于数据库中,请使用如下内容:

elsif User.where(cedula: params[:cedula]).present?
  redirect './signup', :error => "La cédula #{params[:cedula]} ya se encuentra en uso. Intente nuevamente."

但是,请注意,这不会在竞争条件下保护您的数据库。