On Mar 23, 2007, at 21:23 , Rick DeNatale wrote: > On 3/23/07, Keith Tom <keith.tom / gmail.com> wrote: >> Hi all, >> >> I ran into some trouble w/ a model that has a nested hash >> attribute and >> need some help. >> Here are the details: >> >> - migration has "t.column :attribute, :text" >> - model has "serialize :attribute, Hash" >> >> Now when I put a plain (non-nested) hash in my fixtures, this >> attribute >> works fine; I run the tests, it unserializes, and am very happy. >> When I put something like this in the fixture: >> >> attribute: "<%= { :date => 1, :items => 2}.to_yaml %>" >> >> I run the tests and get: >> >> Exception: attribute was supposed to be a Hash, but was a String >> /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4.5618/lib/ >> active_record/base.rb:1951:in >> `unserialize_attribute' >> >> I checked and the string that is being returned is: >> >> --- :items: 2 :date: 1 >> >> I did some googling and was under the impression nested hashes are >> okay... I get the feeling that is wrong... > > You can't nest yaml that way, nesting is indicated by indention, and > the --- indicates the start of a yaml document: > > irb(main):005:0> {:attribute => {:date => 1, :items => 2}}.to_yaml > => "--- \n:attribute: \n :items: 2\n :date: 1\n" > > irb(main):006:0> puts ({:attribute => {:date => 1, :items => > 2}}.to_yaml) > --- > :attribute: > :items: 2 > :date: 1 > => nil > > > Not sure what the solution is, but I think that's the problem. If one wants to put a hash (or an array) on a single line with yaml, you need to use the {} / [] format. So this: --- :attribute: :items: 2 :date: 1 Can be written :attribute: { :items: 2, :date: 1 } I.e. YAML::load(":attribute: { :items: 2, :date: 1 }") => {:attribute=>{:items=>2, :date=>1}} YAML::load("---\n:attribute:\n :items: 2\n :date: 1") => {:attribute=>{:items=>2, :date=>1}} /Christoffer