使用flash通知用户以前的注册

时间:2013-03-19 01:45:53

标签: ruby-on-rails-3

我正在尝试使用我的用户控制器通知用户他们的电子邮件已经在注册中使用,但即使电子邮件已经存在,我仍然会收到错误“Plase验证您的输入并再试一次”而不是“你已经注册了!感谢你的热情!”使用控制器不是实现这种行为的创造方式吗?

在rails控制台中(假设“foo@bar.com”在数据库中“),当我使用user = User.new(name:"Example", email:"foo@bar.com")然后User.find_by_email(user.email)时,它会返回正确的用户条目,所以我不是确定我是否在正确的轨道上,只是错误地执行它或什么。有什么想法吗?

users_controller.rb:

class UsersController < ApplicationController
  def new
    @user = User.new(params[:user])
  end

  def create
    @user = User.new(params[:user])

    if @user.save
      flash[:success] = "Thanks for supporting cofind! We'll be in touch!"
      redirect_to root_path
      UserMailer.welcome_email(@user).deliver
    else
      if @user.email == User.find_by_email(@user.email)
        flash[:error] = "You've already registered! Thanks for being enthusiastic!"
        redirect_to root_path
      else
        flash[:error] = "Plase validate your input and try again."
        redirect_to signup_path
      end
    end
  end 
end

user.rb:

class User < ActiveRecord::Base
  attr_accessible :email, :name

  before_save { |user| user.email = email.downcase }

  validates :name, presence: true
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
end

1 个答案:

答案 0 :(得分:1)

这一行

if @user.email == User.find_by_email(@user.email)

根据用户记录(ActiveRecord对象)检查用户的电子邮件(字符串),该记录始终为false。您应该将其更改为

if User.where(email: @user.email).exists?