MySQL:Log表示记录已经存在

时间:2015-08-02 02:59:11

标签: mysql ruby activerecord sinatra

我正在为项目开发一个注册表单。当用户单击提交按钮时,控制器会检查是否有任何字段为空,然后检查其中一个字段( 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 已经在数据库中,则页面会重新加载并显示一条闪烁消息,指示用户已在使用它。这个问题是,无论用户输入的值如何,始终显示指示不成功寄存器的闪存消息。如果表格完全为空,我只能将一个用户存储到数据库中,否则,我无法进行。

在唯一成功插入之后,根据控制台发送到数据库的查询如下:

日志

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”被发送到服务器。我已根据QueryMethodsFinderMethods尝试了多次查询,但目前无效。

非常感谢任何帮助!

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为你在select方法错误地使用了elsif User.select(:cedula).exists? redirect './signup', :error => "La cédula #{params[:cedula]} ya se encuentra en uso. Intente nuevamente." 方法:

#exists?

根据返回关系对象的文档,如果有任何用户,那么true将返回elsif User.where(cedula: params[:cedula]).present? redirect './signup', :error => "La cédula #{params[:cedula]} ya se encuentra en uso. Intente nuevamente." http://apidock.com/rails/ActiveRecord/QueryMethods/select

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

JMenuItem

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