Rails3.0.1でRuby1.8.7を使用していますが、根本的な原因が「配列===オブジェクト」操作であると思われる問題が発生しています。私は以前、自分で作成したクラスで同じ動作を確認し、「===」演算子を使用せずにその動作をプログラムしました(Rubyの知識にはまだかなり制限されている欠陥があると思いました)。しかし、ActionPack内で発生しているので、それについて何かをする必要があります。
これは、FormHelperの「fields_for」が正常に動作していなかったときに表面化しました。次のビューコードスニペット(「<%%>」は読みやすさを向上させるために削除されました):
form_for @coupon do |f|
...
f.fields_for @coupon.participants do |cp|
...
end
end
form_forヘルパーメソッド内にエラー「ActionView::Template :: Error(undefined method `model_name'for Array:Class):"」が表示されました。「case」コマンドの間違ったブランチを実行していると判断し、ブレークポイントを設定してテストを開始しました。結果は次のとおりです。
/Library/Ruby/Gems/1.8/gems/actionpack-3.0.1/lib/action_view/helpers/form_helper.rb:1152
case record_or_name_or_array
(rdb:1) pp record_or_name_or_array.instance_of? Array
true
(rdb:1) pp Array === record_or_name_or_array
false
(rdb:1) pp Array.object_id
2148267660
(rdb:1) pp record_or_name_or_array.class.object_id
2148267660
これは、「record_or_name_or_array」が間違いなく配列であるのに対し、「Array===record_or_name_or_array」がfalseを返していることをかなり明確に示しています。
ところで、「@ f.fields_for」の構文が間違っていると思われる場合は、「@f」を使用する場合と使用しない場合の両方で試してみました。同じ結果が得られました。RoRとマシンも再起動しましたが、結果は変わりません。