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例外