経緯
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はやっぱ怖いと思った。