为什么这个未使用的self.hash方法导致“无法将String转换为整数”错误?
我正在浏览Lynda Rails 3教程 。 有一次,在一个名为access_controller的控制器中,我们从一个名为AdminUser的模型中调用一个方法。 最初的电话是:
authorized_user = AdminUser.authenticate(params[:username], params[:password])
当我运行rails服务器,打开浏览器,并访问相应的视图时,我收到错误: TypeError,无法将String转换为Integer
之前曾两次问过同样的问题。 提问者第一次说问题第二天就解决了。 (我在3天前第一次碰到这个,所以没有发生过。)第二个问题没有得到解答。 我会尝试提供更多细节:
模型中的方法是:
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转换为Integer”
然后我在Subject模型中创建了一个相同的self.nothing方法。 当我尝试从pages_controller中的show动作运行该方法时,它完全正常。 没有错误。
因此,同样的方法在rails控制台中运行完全正常,当我将它放在我的Subject模型中时完全没问题,但是当我将它放在我的AdminUser模型中时会产生错误。
然后我试着在我的AdminUser模型中基本上注释掉所有内容,看看我是否可以让错误消失。 我终于能够了。 该错误显然是由另一种方法引起的:
def self.hash(password="") Digest::SHA1.hexdigest(password) end
当我们添加这些其他方法时,我应该在几个video课程之前删除了这个方法:
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转换为整数”错误?
原因是User.hash
重写了应该返回Fixnum
Object.hash
。 您应该更改User.make_hash
之类的名称