2012-02-13 7 views
0

私はLynda Rails 3 tutorialを実行しています。ある時点で、access_controllerというコントローラでは、AdminUserというモデルからメソッドを呼び出します。元のコールは:なぜこの未使用のself.hashメソッドは "文字列を整数に変換できません"というエラーを引き起こしますか?

authorized_user = AdminUser.authenticate(params[:username], params[:password]) 

私はブラウザを開く、レール・サーバを実行し、適切なビューにアクセスし、私はエラーを取得:TypeError例外は、整数

これを文字列に変換することはできません同じ質問が尋ねられましたtwicebefore。質問者は初めて、問題は次の日に解決したと言います。 (私はこの3日前に初めて遭遇したので、これは起こらなかった)。第2の質問は答えられていない。私は多くのより詳細な情報を提供しようとします:

モデル内のメソッドだった:

def self.authenticate(username="", password="") 
    user = AdminUser.find_by_username(username) 
    if user && user.password_match?(password) 
     return user 
    else 
     return false 
    end 
    end 

私はレールコンソールからこのメソッドを呼び出すと、それは完全に正常に動作します。コントローラーからそれを呼び出すか、ブラウザー経由で取得しようとしていることが間違っているようです(私は相対的な初心者なので、この考え方をうまく表現できないことを謝ります)。私は以来、同じAdminUserモデルでより単純な方法でこのエラーを再現しました。

def self.nothing 
    true 
    end 

これでも私には同じエラーが表示されます。次に、別のコントローラとアクション(pages_controller#showと呼ばれる)からself.nothingメソッドを呼び出すことを試みました。私はブラウザでそれを開こうとしたとき、再び同じエラーが発生しました。「文字列を整数に変換できません」

次に、Subjectモデルに同じself.nothingメソッドを作成しました。私がpages_controllerのshowアクションからそのメソッドを実行しようとすると、それはまったく問題ありません。エラーはありません。

したがって、同じメソッドがレールコンソールで完全に正常に動作しますが、Subjectモデルに配置すると完全に問題ありませんが、AdminUserモデルに配置するとエラーが発生します。

私は、AdminUserモデルで視覚的にすべてをコメントアウトして、エラーを取り除くことができるかどうかを確認しました。私はついにできました。

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 

私は最初の1を削除したことがない、私は、我々はこれらの他のメソッドを追加したときに、いくつかのビデオレッスン前にこのメソッドを削除したはずだった

def self.hash(password="") 
    Digest::SHA1.hexdigest(password) 
end 

:エラーが明らかに別の方法によって引き起こされました何らかの理由で、エラーの原因となっていました。

私の質問は次のとおりです。理由はどこにも使われていなかったこのメソッドを "この文字列を整数に変換できません"というエラーが発生したのはなぜですか?

+0

私は非常に厳密には読んでいませんが、Rubyがコードをリロードするときに新しいメソッドをロードしますが、古いメソッドは削除しないことに注意してください。手動で行うか、サーバーを再起動する必要があります。 – apneadiving

+0

応答していただきありがとうございます。私は何度も再起動してから問題が発生しているとは思われませんが、それはわかりませんでしたので参考にしています。 – gmich

+1

完全なスタックトレースを投稿できますか? – Substantial

答えて

1

User.hashObject.hashをオーバーライドし、Fixnumを返す必要があるためです。 何かの名前を変更する必要がありますUser.make_hash

関連する問題