2012-01-18 6 views
5

Por razones que hasta ahora soy completamente incapaz de descifrar, ya no puedo usar ActiveSupport :: HashWithIndifferentAccess.No se puede serializar como ActiveSupport :: HashWithIndifferentAccess más

La parte pertinente del modelo se parece a esto:

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

(I añade la opción de tratar de forzarlo a lo largo, pero no ha ayudado Anteriormente esto era todo funciona bien, y yo no'. t have that there.)

Durante el tiempo que el objeto está en la memoria, todo funciona bien. Es correctamente un HashWithIndifferentAccess, y la vida es buena. Una vez que se guarda en la base de datos, se guarda como un hash en su lugar:

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   | 
+----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+ 

que significa que no se puede forzar de nuevo en un HashWithIndifferentAccess y cosas volar como esto:

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 

Esto es usando Rails 3.1.3, almacenando los datos en MySQL usando la versión mysql2 gem 0.3.10. También estoy ejecutando ruby ​​1.9.2p290. Puedo agregar más información que cualquiera consideraría útil, pero no sé cómo depurar esto aún más.

Respuesta

4

1.9.2 normalmente incluye Psych como la biblioteca YAML. Sin embargo, libyaml es una dependencia externa, y 1.9.2 defecto en el empleo Syck (la antigua biblioteca) si libyaml no está disponible cuando se compila Rubí: link

El hecho de que YAML Psych-IZES ActiveSupport :: HashWithIndifferentAccess como un estándar hash es oustanding issue en Psych's Github. Parece que se corrigió en 1.9.3 sin embargo.

3

Aparentemente esto se rompe directamente con 1.9.2-p290.

Actualizando a 1.9.3, o degradando a 1.8.7 y todo es color de rosa. Sin embargo, me encantaría una mejor respuesta que esa, si alguien tiene alguna idea.

0

Si puede, cambie a syck.

En application.rb:

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

Por si acaso alguien tiene el mismo problema que he estado teniendo, que es similar a esto, pero no es lo mismo, les dejo la respuesta aquí. Tengo un hash que se serializa en el modelo, que se guarda correctamente en el db. En una interfaz, necesito regenerar el hash en JS, que luego crearía entradas en el db que contiene! Map: ActiveSupport :: HashWithIndifferentAccess en lugar de los datos correctos. Estoy generando el hash como una cadena y luego convirtiendo a un hash usando eval. Esto creó un hash, según sea necesario. Pero estaba volviendo a poner el hash en el algoritmo hash de params, por lo que podría usar update_attributes en el controlador que lo estaba convirtiendo a HashwithIndifferentAccess, causando el problema

Cuestiones relacionadas