我正在跑过Lynda Rails 3 教程 http://www.lynda.com/Ruby-on-Rails-3-tutorials/essential-training/55960-2.html。在某一时刻,在名为 access_controller 的控制器中,我们调用名为 AdminUser 的模型中的方法。原来的调用是:
authorized_user = AdminUser.authenticate(params[:username], params[:password])
当我运行 Rails 服务器、打开浏览器并访问相应的视图时,出现错误:类型错误,无法将字符串转换为整数
已被问过同样的问题twice https://stackoverflow.com/questions/6497351/cant-convert-string-into-integer-in-ruby-ruby-on-rails before https://stackoverflow.com/questions/9048098/user-authentication-trying-to-convert-string-into-integer。第一次,提问者说问题第二天就解决了。 (我三天前第一次遇到这个问题,所以还没有发生。)第二个问题还没有得到解答。我将尝试提供更多细节:
模型中的方法是:
def self.authenticate(username="", password="")
user = AdminUser.find_by_username(username)
if user && user.password_match?(password)
return user
else
return false
end
end
当我从 Rails 控制台调用这个方法时,它工作得很好。从控制器调用它,或者尝试通过浏览器访问它,似乎出了问题(我是相对初学者,所以我很抱歉我无法更好地表达这个想法)。此后,我在同一 AdminUser 模型中使用更简单的方法复制了此错误:
def self.nothing
true
end
这仍然给我同样的错误。然后我尝试从不同的控制器和操作(称为pages_controller#show)调用 self.nothing 方法。当我尝试在浏览器中打开它时,我再次遇到相同的错误:“无法将字符串转换为整数”
然后我在我的主题模型中创建了一个相同的 self.nothing 方法。当我尝试从页面控制器中的显示操作运行该方法时,它工作得很好。没有错误。
因此,相同的方法在 Rails 控制台中运行得很好,当我将它放入我的主题模型中时也运行得很好,但当我将它放入我的 AdminUser 模型中时会产生错误。
然后,我尝试注释掉 AdminUser 模型中看到的所有内容,看看是否可以使错误消失。我终于能够了。该错误显然是由另一种方法引起的:
def self.hash(password="")
Digest::SHA1.hexdigest(password)
end
当我们添加这些其他方法时,我应该在几个视频课程前删除此方法:
def self.make_salt(username="")
Digest::SHA1.hexdigest("Use #{username} with #{Time.now} to make salt")
end
def self.hash_with_salt(password="", salt="")
Digest::SHA1.hexdigest("Put #{salt} on the #{password}")
end
我从未删除过第一个,但由于某种原因,它是导致错误的那个。
所以,我现在的问题是:为什么留在该方法(没有在任何地方使用)会导致“无法将字符串转换为整数”错误?