Settingslogicから「Missing setting "to_ary"」

Settingslogicを使っているアプリケーションのrspecでMissing setting `to_ary' in .../setting.ymlという感じのエラーになった。specの中にもアプリケーションコードの中にもto_aryなんて出てこないんだが?

specでコケているところを特定したり、コードをあさったりしたがよく分からず。改めてバックトレースを確認するとrspecのfull_descriptionの中でコケている。どうもおかしいなと、いったんspecの中身を空にしてから1.should eq(2)のようにコードに関係なくコケる内容にしてみたところ、それでも問題のエラーを起こせることが分かった。

# アプリケーションのコード
class Setting < Settingslogic; end
# spec
describe Setting do
  it 'should fail' do
    1.should eq(2)
  end
end

つまりspecの内容には関係なく、アプリケーションにも関係ない。残るはdescribe Settingのみ。これをdescribe 'Setting'にするとエラーが起きなくなった。(specが通らなかったという結果がいつも通り表示される。)

もう少し調べてみたところSettingslogicにpull requestが(いくつか)出ていた。たとえばこれ。問答無用でto_aryとかを使えなくするのもどうなんだろうと思うが、それはともかく。

要するにflattenすると要素オブジェクトにもto_aryが投げかけられるわけだが、Settingslogicなクラスだとto_aryを設定キーとして扱ってしまい、flattenが想定する例外とは違う例外が発生すると、そういうことみたい。

[Object].flatten # => [Object]
[Setting].flatten # => Settingslogic::MissingSetting例外