rails dynamic find_by方法在Class方法中不起作用

时间:2010-11-28 22:52:17

标签: ruby-on-rails

我有一个具有身份验证方法的用户模型。

如果我在rails控制台中使用模型进行测试可以创建一个用户就好了,然后我可以在电子邮件上查找并完全返回用户。

user = User.find_by_email("someaddress@email.com")

现在,如果我尝试像这样调用身份验证方法并返回用户,那么我的身份验证方法中的puts user语句将返回nil

user = User.authenticate("someaddress@email.com", "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

我对此问题感到茫然。看到这个问题的一些人将非常感激。

4 个答案:

答案 0 :(得分:2)

你在Class方法中使用find_by方法的方法很好;应该工作。

你确定nil输出是来自put吗? nil可能是你方法的输出。 user.has_password?可能存在错误。

而不是puts,请尝试:

p user

......只是为了确定。

答案 1 :(得分:0)

在调用find_by_email之前,您是否检查了电子邮件的值?也许它的空间不足,所以请检查sql日志并将其复制到dbconsole。

答案 2 :(得分:0)

如果符合以下情况,此方法将返回nil

  • 没有用户对象(不太可能,因为find_by_email在控制台中工作)
  • 如果has_password?返回false,那很可能。

检查您的has_password?方法做得对不对。

答案 3 :(得分:0)

我找到了答案的人......非常感谢您跳槽并建议解决方案。

我有另一种方法,我没有包含在上面的代码中,这是“真正的”问题。

至于我原来的问题,事实证明该方法正在发挥作用。我在传递给方法的字符串中输入了拼写错误。基本上我在电子邮件的末尾留下了“.com”。

通常一个简单的拼写错误让我觉得发布这个问题真的很愚蠢,但考虑到所有问题,看着你的建议让我找到了解决方案,所以非常感谢。