1

ユーザーコントローラーを使用して、ユーザーの電子メールがすでに登録で使用されていることをユーザーに通知しようとしていますが、電子メールが既に存在する場合でも、「入力を検証して再試行してください」というエラーではなく、「もう一度やり直してください」というエラーが表示されます。すでに登録済みです!熱心に感謝します!」コントローラを使用することは、この動作を実現するための作成方法ではありませんか?

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
4

1 に答える 1

1

この行

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

ユーザーの電子メール(文字列)をユーザーレコード(ActiveRecordオブジェクト)と照合します。これは常にfalseになります。これを次のように変更する必要があります

if User.where(email: @user.email).exists?
于 2013-03-19T01:57:09.857 に答える