我是Rails的新手,目前正在从 http://ruby.railstutorial.org/chapters/modeling-and-viewing-users-one#top 的教程中学习
但是,当我在User.authenticate("test@test.com","testing")上执行find_by_email时,find_by_email在控制台上工作我得到一个零返回
我哪里可能出错了?
以下是我的模型User.rb的部分代码
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :email, :password, :password_confirmation
email_regex = /A[w+-.]+@[a-zd-.]+.[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"),结果返回了本地数据库中的记录。
这实际上是身份验证方法的问题。 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
只要您明确返回用户作为最后一行,我认为一切都应该没问题。