2010-11-28 3 views
3

У меня есть модель пользователя, в которой есть метод аутентификации.рельсы динамический метод find_by, не работающий в методе класса

Если я тестирую с помощью модели в рельсах, консоль может создать пользователя как можно точнее, а затем я смогу найти на нем электронную почту и вернуть пользователя в полном соответствии с этим.

user = User.find_by_email("[email protected]") 

Теперь, если я пытаюсь вызвать метод аутентификации, как это и вернуть пользователь заявление пользователя помещает в моей аутентификации метод возвращает ноль

user = User.authenticate("[email protected]", "foobar") 

Модель выглядит что-то вроде этого

class User < ActiveRecord::Base 

    attr_accessor :password 
    attr_accessible :first_name, :last_name, 
        :email, :birth_date, :sex, 
        :password, :password_confirmation 


    def self.authenticate(email, submitted_password) 
    user = find_by_email(email) 

    puts user #this returns nil so my class is never able to authenticate the user 

    return nil if user.nil? 
    return user if user.has_password?(submitted_password) 
    end 

end 

Я в затруднении по поводу проблемы. Некоторые из них видят в этом вопросе.

ответ

2

Способ использования метода find_by внутри метода класса прекрасен; которые должны работать.

Вы уверены, что выход nil от puts? Нуль, возможно, результат вашего метода. Возможно, в этом user.has_password?.

Вместо puts, попробуйте:

p user 

... просто чтобы быть уверенным.

0

Вы проверяли значение электронной почты перед вызовом find_by_email? Возможно, в нем есть недопустимое место, поэтому проверьте журнал sql и скопируйте его в dbconsole.

0

Этот метод вернет nil если либо:

  • Там не было ни одного объекта пользователя (маловероятно, так как find_by_email работы в консоли)
  • If has_password? возвращает false, который, скорее всего.

Проверьте свой метод has_password? в порядке.

+0

Это было истинное решение BTW. Я нашел его, прежде чем увидел ваше предложение. Хороший звонок. – mattwallace 2010-11-28 23:52:43

0

Я нашел ответ, ребята ... большое спасибо за то, что он прыгнул и предложил какое-то решение.

У меня был другой метод, который я не включил в код выше, который был «реальной» проблемой.

Что касается моего первоначального вопроса, выясняется, что этот метод работал. У меня была опечатка в строке, которую я передавал методу. В основном я оставил «.com» в конце письма.

Как обычно, простая опечатка заставляет меня чувствовать себя глупо для публикации вопроса, но, несмотря на все мысли, хотя проблема и поиск ваших предложений помогли мне найти решение, так спасибо.

Смежные вопросы