ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Очевидно, что это действительно плохая идея, поскольку злоумышленник может продолжать пробовать электронные письма, пока не найдет тот, который соответствует, и затем он может начать пробовать пароли для этого электронного письма, которое, как он знает, существует в вашей базе данных, но ты спрашиваешь, так что решать тебе или нет.
Ваш метод аутентификации, очевидно, возвращает пользователя только в том случае, если адрес электронной почты и пароль совпадали, измените метод аутентификации, чтобы он возвращал логическое значение и пользователя, если они есть. Это выглядело бы примерно так:
def authenticate(email, password)
u = first(:conditions => {:email => email, :state => 'active'})
u && u.authenticated?(password) ? [true, u] : [false, u]
end
Затем на вашем контроллере:
def create
result , user = User.authenticate(params[:email], params[:password])
if result
session[:user_id] = user.id
redirect_to user.profile, :notice => "Logged in successfully"
elsif user
session[:email] = @user.email
flash.now[:alert] = "Invalid email. Try again!"
render :action => 'new'
else
session[:password] = @user.password
flash.now[:alert] = "Invalid password. Try again!"
render :action => 'new'
end
end
И это должно сработать.