我是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”),并且我在本地数据库中返回了记录。
答案 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
只要你明确地将用户作为最后一行返回,我认为一切都应该没问题。