StripeObject について

最近お仕事で決済サービスの Stripe を使っているので色々メモする。
溜まったらまとめて Qiita に記事にするかな。

Ruby で Stripe の API を叩くと StripeObject が返ってくる。StripeObject のドキュメントは
http://www.rubydoc.info/github/stripe/stripe-ruby/Stripe/StripeObject ここにあって、内部に Set を持っていて key value を管理している様子。
この StripeObject は Hash っぽいけど Hash じゃないので稀にハマる。
以下の点が気になる

  1. key? が使えないので値が nil な要素は判別不可能
  2. 文字でも symbol でもアクセスできる (with_indifferent_acceesしたような感じ)

StripeObject は to_h で hash に変換できるので、1 番目の問題は解決できる。でも hash に変換すると文字列ではアクセスできなくなる。
StripeObject を扱う時は to_h.with_indifferent_access してやると良いかもしれない。

rails c などコンソールで挙動を確かめる時は construct_from で実際に StripeObject を作ってみると良い。

pry(main)> a = Stripe::StripeObject.construct_from({id: 1, 'foo' => 'bar', 'hoge' => {piyo: nil}})
=> #<Stripe::StripeObject:0x3ff2b128bb60 id=1> JSON: {
  "id": 1,
  "foo": "bar",
  "hoge": {"piyo":null}
}
pry(main)> a[:id]
=> 1
pry(main)> a['id']
=> 1 // symbol でも文字列でもアクセスできる
pry(main)> a.to_h[:id]
=> 1
pry(main)> a.to_h['id']
=> nil // 文字列ではアクセスできなくなる