我是Ruby和ROR的新手。我想在用户注册时向用户显示验证错误(例如密码丢失,电子邮件丢失)。如果他们提交了所需的输入,我创建用户并将其重定向到登录页面如果他们提供了数据库中已有的电子邮件地址和通过验证的密码我不想保存用户,但我确实希望将他们重定向到登录页面。我们的想法是不要通过向他们提供重复的电子邮件错误来泄露已经是用户的人。
我已经注册表单了。如果他们提交了重复的电子邮件和通过验证的密码,我只是对如何将用户重定向到登录页面感到困惑。我需要为此设置自定义验证吗?
例如,假设我的用户表中有john_doe@yahoo.com,并且用户注册了以下内容:
Case 1:
email = john_doe@yahoo.com
password = null
result = user redirected to sign up page with error about password being blank
Case 2:
email = john_doe@yahoo.com
password = p@55w0rd
result = user redirected to login page with success message
Case 3:
email = sally@yahoo.com
password = p@55w0rd
result = user redirected to login page with success message
UsersController
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params[:user].permit(:email, :password))
if @user.save
redirect_to root_url, :notice => "signed up!"
else
render 'new'
end
end
end
用户模型
class User < ActiveRecord::Base
attr_accessor :password
before_save :encrypt_password
validates_confirmation_of :password
validates_presence_of :password, :on => :create
validates_presence_of :email
def encrypt_password
if password.present?
self.password_salt = BCrypt::Engine.generate_salt
self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end
end
def self.authenticate email, password
user = find_by_email(email)
if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
return user
end
return nil
end
def exists?
if find_by_email(email)
return true
end
return false
end
end
答案 0 :(得分:2)
您可以在 UsersController 中指定重定向:
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params[:user].permit(:email, :password))
if @user.save
redirect_to root_url, :notice => "signed up!"
else
redirect_to login_url, :notice => "There was something wrong with your e-mail or password"
end
end
end
我真的建议使用Devise - 它将为您处理这些一次性案例: https://github.com/plataformatec/devise
如果您希望更多地使用身份验证,我建议使用has_secure_password方法: http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html has_secure_method 负责保存您的密码并进行验证。
答案 1 :(得分:1)
像这样修改用户控制器中的else路径
else
redirect_to login_path
end
如果您使用的是devise和simple_form,那么所有这些(重定向,在无效数据上显示错误)都将自动为您处理。
要在电子邮件中添加uniqueness constraint,请在您的模型中执行以下操作:
validates :email, uniqueness: true