やる気がストロングZERO

やる気のストロングスタイル

activeresource-responseを入れたら既存挙動が変わってバグった

経緯

activeresourceでデータ取得するロジックがあった。

user = User.find(1)
data = user.some_data # apiアクセスを実行してデータを取得

dataがnilだったら〜〜という処理があった

# data == nilのとき、resultには"データはありませんでした"が入る想定。
result = data || "データありませんでした"

ある日、httpヘッダ情報が必要になったがactiveresourceでは取得できないのでググって見つかったgem(activeresource-response)を入れて対応した。

user = User.find(1)
some_header = user.http_response["some_header"]

すると、既存ロジックの挙動が変わった。

user = User.find(1)
data = user.some_data # apiアクセスを実行してデータを取得

# data == nilのとき、resultにはnilが入るようになってしまった。
result = data || "データありませんでした"

原因

返却値dataのclassが変わっていた。
(多分返却データにヘッダ情報を取得するメソッドを追加するため。)

gemを入れる前

user = User.find(1)
data = user.some_data
data.class # NilClass
data == nil # true
data.nil? # true
data # nil
result = data || "データがありませんでした" # resultには"データがありませんでした"が入る

gemを入れた後

user = User.find(1)
data = user.some_data
data.class # SimpleDelegatorになってた
data == nil # true
data.nil? # false
data # nil
result = data || "データがありませんでした" # resultにはnilが入る

まとめ

既存オブジェクトに対して知らないところで処理を追加するようなgemはやっぱ怖いと思った。