我正在为项目开发一个注册表单。当用户单击提交按钮时,控制器会检查是否有任何字段为空,然后检查其中一个字段( 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”被发送到服务器。我已根据QueryMethods和FinderMethods尝试了多次查询,但目前无效。
非常感谢任何帮助!
提前致谢。
答案 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
但是,请注意,这不会在竞争条件下保护您的数据库。