为什么这个未使用的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之类的名称