1

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とマシンも再起動しましたが、結果は変わりません。

4

3 に答える 3

2

これを試して:

@coupon = Coupon.last
Array === @coupon.participants #=> false
Array === @coupon.participants.find(:all) #=> true

アソシエーション@coupon.participantsは配列ではなく、プロキシです。trueである理由@coupon.participants.class == Arrayは、activerecord-3.0.9 / lib / active_record /associations /association_proxy.rb:25に記載されています。

追加:別の興味深い実験はです@coupon.participants.superclass

于 2011-06-26T02:40:23.043 に答える
0

コンソール(rails c)から実行してみてください:

@coupon = Coupon.last
Array == @coupon.participants

その呼び出しがfalseを返す場合は、関連付けが正しく設定されていない可能性があります(つまりhas_many :participantsbelongs_to :coupon)。

于 2011-06-25T21:32:49.293 に答える
0

@coupon.is_a? Arraytrueを返す必要があります。つまり、のシングルトンインスタンスに等しい@coupon === Arrayということです。@couponArray

于 2011-06-25T21:57:02.910 に答える