1

次のコードは、TypeError (凍結されたオブジェクトを変更できません) を生成します。しかし、私たちがしているのは、キャッシュされたアイテムを複製することだけです。理由を知っている人はいますか?Rails 3.0.6 と Ruby 1.8.7 を使用しています。ありがとう!

また、クローンを使用して結果のオブジェクトを解凍しようとしましたが、同じ例外が発生しました。

packは他の場所では定義されていません。

    cached_pack = Rails.cache.fetch( 'packs/' + pack_id, {:expires_in => 10.days} ) do
        Rails.logger.info '+++ Cache miss: '
        Pack.find pack_id
    end         

    pack = cached_pack.dup
4

2 に答える 2

0

TLDNRバージョン:cloneではなく、を使用しますdup

との間には2つの主な違いがcloneありdupます。

  • dupシングルトンメソッドを複製しませんが、複製cloneします。
  • 凍結されたオブジェクトのcloneも凍結されます(凍結されたdupオブジェクトのは凍結されません)。

これがRails3.1以降での動作です。あなたの場合、 Rails 3.1で導入されたcloneため、を使用する必要ActiveRecord#dupがあります。したがって、を呼び出す可能性がありますKernel#dup

UPDところで、Rails.cacheオブジェクトをサイレントにフリーズし、キャッシュに入れます(少なくともRails <3.2では)。このような動作を回避するために、オブジェクト自体ではなくオブジェクトの複製をキャッシュに配置できます。

cached_resource.cache.write( \
  key, object.dup, :expires_in => cached_resource.generate_ttl \
)
于 2013-03-01T05:32:49.250 に答える
0

解決策は、dup が導入されているため、Rails 3.1 以降にアップグレードすることです。

于 2013-03-07T04:50:24.727 に答える