我々は4.2.5.1へのRails 4.1.14から私たちのアプリケーションをアップグレードして、次の問題がヒット:どうやら4.1と4.2の間のActiveRecordセッターの違いは?
string = "SomeString"
ar_model = SomeArModel.new
ar_model.some_attribute = string
# next line is true for 4.1, but fails for 4.2
ar_model.some_attribute.object_id == string.object_id
を、オブジェクトのセッターDUPすべてのオブジェクト(私は配列を持っている場合、内部のすべてのオブジェクトも同様にだまされます)これが意図されていて、新しいセキュリティ機能の一部であれば、私は不思議です。
更新
私は両方のレールのバージョンのルビー2.2.2p95を使用しています。参考のために私は小さなプロジェクトでした:
その後rails new testproject
rails g model Building name:string
rails db:migrate
rails c
>> b = Building.new
>> name = "Testname"
>> b.name = name
>> name.object_id # => 70199493308960
>> b.name.object_id # => 70199493278780
は、私が唯一のGemfileに4.1.14にRailsのバージョンを変更し、=>両方のobject_idが同じであったもう一度試してみました。 だから、
また、ルビー2.2.3とJRubyの9.0.4.0にも当てはまる... ar_model.attributes_before_type_cast['some_attribute']
が含まれているRubyのバージョンにのみ ...
アップデート2を頼ることはできません実際のオブジェクト。
あなたの正確なRailsのバージョンは何ですか?上の式はTrueを返します。 第2に、これはRailsとは関係ないと思います。オブジェクト参照/メモリ管理を扱うのはRubyの仕事です –
4.1.14と4.2.0と4.2.5.1で二重チェックしました。後者の2人は偽を返します。私はレールをアップグレードして工夫しただけで、他の宝石やルビーはありません –
これはRubyの問題のようなものです。ルビは、参照渡しの代わりに常に値渡しであることを覚えておいてください。さらに詳しい情報はこれをチェックしてください:http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value – aliibrahim