我正在浏览Lynda Rails 3 tutorial。有一次,在一个名为access_controller的控制器中,我们从名为AdminUser的模型中调用一个方法。最初的电话是:
authorized_user = AdminUser.authenticate(params[:username], params[:password])
当我运行rails服务器,打开浏览器,并访问相应的视图时,我收到错误: TypeError,无法将String转换为Integer
同样的问题已经被问到twice before。提问者第一次说第二天问题就解决了。 (我第一次遇到这个,所以没有发生过。)第二个问题没有得到回答。我将尝试提供更多细节:
模型中的方法是:
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
这仍然给我同样的错误。然后我尝试从不同的控制器和动作调用self.nothing方法(称为pages_controller #show)。当我试图在浏览器中打开它时,我再次得到了同样的错误:“无法将String转换为整数”
然后我在Subject模型中创建了一个相同的self.nothing方法。当我尝试从pages_controller中的show动作运行该方法时,它完全正常。没有错误。
因此,相同的方法在rails控制台中运行完全正常,当我将它放在我的Subject模型中时完全没问题,但是当我将它放在我的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
我从未删除过初始版本,但由于某种原因,它是导致错误的那个。
所以,我现在的问题是:为什么离开那个方法(没有在任何地方使用)导致这个“无法将String转换为整数”错误?
答案 0 :(得分:1)
原因是User.hash
会覆盖应返回Object.hash
的{{1}}。
您应该更改Fixnum