find_by_email在函数中执行的结果与控制台不同

时间:2011-05-16 15:32:50

标签: ruby-on-rails ruby-on-rails-3

我是Rails的新手,我目前正在学习http://ruby.railstutorial.org/chapters/modeling-and-viewing-users-one#top

的教程 但是,当我在User.authenticate(“test@test.com”,“testing”)上执行find_by_email时,

find_by_email在控制台上运行 我得到一个nil返回

我可能在哪里出错?

以下是我的模型User.rb

的部分代码
class User < ActiveRecord::Base
  attr_accessor   :password
  attr_accessible :name, :email, :password, :password_confirmation

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name,     :presence      => true, 
                       :length        => { :maximum => 50 }
  validates :email,    :presence      => true,
                       :format        => { :with => email_regex },
                       :uniqueness    => { :case_sensitive => false }

  validates :password, :presence      => true,
                       :confirmation  => true,
                       :length        => { :within => 6..40 }

  before_save :encrypt_password

  # Return true if the user's password matches the submitted password.
  def has_password?(submitted_password)
    # Compare encrypted_password with the encrypted version of
    # submitted_password.
    encrypted_password == encrypt(submitted_password)
  end

  def self.authenticate(email, submitted_password) 
    user = find_by_email(email)
    return nil if user.nil?
    # return nil if user.has_password?(submitted_password)
  end

我在rails控制台上尝试了User.find_by_email(“test@test.com”),并且我在本地数据库中返回了记录。

1 个答案:

答案 0 :(得分:1)

这实际上是您的身份验证方法的问题。 Ruby总是返回它在方法中执行的最后一行的值。由于方法的最后一行是:

return nil if user.nil?

这与:

相同
if user.nil?
  return user
end

当你的用户是正确的时,if中的代码没有被执行,但之后仍然没有返回值,所以authenticate返回nil而不管。我会尝试使用此代替您的return nil if user.nil?行:

return user if user

或者如果您更喜欢明确性:

return user unless user.nil?

甚至更明确:

return user.nil? ? nil : user

只要你明确地将用户作为最后一行返回,我认为一切都应该没问题。