Ruby の Redis gem はエラー メッセージで整数を返すようです?
概要
Ruby の Redis gem の周りにライブラリ ラッパーを実装しました。
CacheManager.get(“key”) を呼び出すと、何らかの理由でレスキューに引っかかるエラーが発生することがあります。エラーは次のようになります。未定義のメソッド ‘join’ for 20325:Integer (NoMethodError)。明らかな修正は、error.message で .to_s を呼び出すだけですが、何が起こっているのか、そしてなぜ Redis がエラー メッセージとして整数を返すのかを理解したいと思っています。
class CacheManager
def self.get(k, default_value = nil)
begin
$redis_pool.with { |conn| conn.get(k) } || default_value
rescue => error
Rails.logger.error([error.message] + error.backtrace).join($/)
default_value
end
end
end
解決策
この行でエラーが発生すると思います。
Rails.logger.error([error.message] + error.backtrace).join($/)
これは、Redis ではなく、この行を先頭に 20325:Integer (NoMethodError) の未定義メソッド ‘join’ を発生させる整数を返す Redis gem による例外発生でもありません。
Rails.logger.error は整数を返し、その整数に対して join を呼び出します。このメソッドの戻り値は、ロガーの構成とバージョンによって異なります。
その行を再フォーマットすると、その行の問題がより明確になります。
lines = [error.message] + error.backtrace
Rails.logger.error(lines).join($/)
この問題を解決するには、次のように括弧を修正して、ロガー呼び出しではなく、結合したい配列に対して join を呼び出すようにする必要があります。
lines = [error.message] + error.backtrace
Rails.logger.error(lines.join($/))
または
Rails.logger.error([error.message].concat(error.backtrace).join($/))