2012-01-18 9 views
5

私はこれまでのところ完全に解読できないため、もはやActiveSupport :: HashWithIndifferentAccessを使用できなくなりました。ActiveSupport :: HashWithIndifferentAccessとしてもうシリアル化できません

モデルの関連部分は次のようになります。

class Item < ActiveRecord::Base 
    serialize :metadata, ActiveSupport::HashWithIndifferentAccess 

(私は試してみて、それに沿って強制するオプションを追加しましたが、それは助けていない以前は、これはすべての罰金働いていた、と私は」なかったの。それがあります)。

オブジェクトがメモリ内にある限り、すべて正常に動作します。それは正しくHashWithIndifferentAccessであり、人生は良いです。

mysql> select * from items; 
+----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+ 
| id | link | text  | metadata                                                                                                                                                                                       | category_id | 
+----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+ 
| 1 | NULL | Apple Store | --- 
id: 42cc7080f964a520e9251fe3 
name: Apple Store 
contact: 
    phone: '4153920202' 
    formattedPhone: (415) 392-0202 
location: 
    address: 1 Stockton St. 
    crossStreet: at Ellis St. 
    lat: '37.78573590563453' 
    lng: '-122.40610713227913' 
    distance: '1784' 
    postalCode: '94108' 
    city: San Francisco 
    state: CA 
    country: USA 
categories: 
    '0': 
    id: 4bf58dd8d48988d122951735 
    name: Electronics Store 
    pluralName: Electronics Stores 
    shortName: Electronics 
    icon: https://foursquare.com/img/categories/shops/technology.png 
    parents: 
    - Shops & Services 
    primary: 'true' 
verified: 'false' 
stats: 
    checkinsCount: '30462' 
    usersCount: '16105' 
    tipCount: '128' 
url: http://apple.com/sanfrancisco 
hereNow: 
    count: '7' 
| 1   | 
+----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+ 

それはHashWithIndifferentAccessに戻す強要することはできないと物事はこのように爆破意味:これは

ActiveRecord::SerializationTypeMismatch in Index#index 

Showing /development/lists.io/website/app/views/users/_todo.html.haml where line #7 raised: 

Attribute was supposed to be a ActiveSupport::HashWithIndifferentAccess, but was a Hash 

それがデータベースに保存されますと、それは代わりにハッシュとして保存されていますRails 3.1.3を使用して、mysql2 gemバージョン0.3.10を使用してMySQLにデータを格納します。私もルビー1.9.2p290を実行しています。私はもう誰も役に立つと思う情報を追加することができますが、これをさらにデバッグする方法については迷っています。

答えて

4

1.9.2は、通常、YAMLライブラリとしてPsychを含む。ルビーがコンパイルされるときlibyamlが利用できない場合は、libyamlは外部依存関係である、とはSyck(旧図書館)を使用する1.9.2デフォルト:link

そのサイコYAML-化しactivesupportの:: HashWithIndifferentAccess事実標準としてハッシュはPsych's Githubのoustanding issueです。しかし、1.9.3で修正されているようだ。

3

明らかに、これは1.9.2-p290でまっすぐに壊れています。

1.9.3にアップグレードするか、1.8.7にダウングレードしてすべてのピーチを表示します。だれかがアイデアを持っていれば、私はそれよりも良い答えが得られるだろう。

0

可能であれば、syckに切り替えてください。 application.rbで

require 'yaml' 
YAML::ENGINE.yamler = 'syck' 
0

念の誰もが、私はここで答えを掲示しています、これに似ていますが同じではありません、私が持ってきた同じ問題を持っています。私は、データベースに正しく保存されているモデルでシリアル化されているハッシュを持っています。 1つのインターフェイスで、私はJSでハッシュを再生成する必要があります。これは正しいデータではなく、!map:ActiveSupport :: HashWithIndifferentAccessを含むデータベースにエントリを作成します。私は文字列としてハッシュを生成してから、evalを使ってハッシュに変換しています。これにより、必要に応じてハッシュが作成されました。しかし、私はハッシュをparamsハッシュに戻していたので、問題を引き起こしているHashwithIndifferentAccessに変換していたコントローラでupdate_attributesを使うことができました。

関連する問題