【问题标题】:MySQL: Log says record already existsMySQL:日志说记录已经存在
【发布时间】:2015-08-02 02:59:11
【问题描述】:

我目前正在为一个项目开发注册表单。当用户点击 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 已在数据库中,则页面会重新加载并显示一条闪现消息,指示用户它已在使用中。这样做的问题是,无论用户输入什么值,都会显示指示注册不成功的闪存消息。如果表完全为空,我只能将一个用户存储到数据库中,否则我无法。

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

日志

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尝试了多个查询,到目前为止都没有成功。

任何帮助将不胜感激!

提前致谢。

【问题讨论】:

    标签: mysql ruby activerecord sinatra


    【解决方案1】:

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

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

    根据返回关系对象的文档,所以如果有任何用户,那么#exists? 将返回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."
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多