验证失败时不保存用户,但重定向就像通过一样

时间:2014-01-22 03:19:29

标签: ruby-on-rails activerecord

我是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

2 个答案:

答案 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