Forum: Ruby Serializing a nested hash

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
559b0d113163b1507dbbd8dca3a051df?d=identicon&s=25 Keith Tom (Guest)
on 2007-03-23 18:39
(Received via mailing list)
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...

Thanks in advance guys!
Keith
8f6f95c4bd64d5f10dfddfdcd03c19d6?d=identicon&s=25 Rick Denatale (rdenatale)
on 2007-03-23 21:24
(Received via mailing list)
On 3/23/07, Keith Tom <keith.tom@gmail.com> wrote:
> works fine; I run the tests, it unserializes, and am very happy.
> 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.


--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/
E4d8c6e0e9e5ca6ab51b4b1937586e6f?d=identicon&s=25 Christoffer Lernö (Guest)
on 2007-03-24 12:05
(Received via mailing list)
On Mar 23, 2007, at 21:23 , Rick DeNatale wrote:

>>
>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4.5618/lib/
> You can't nest yaml that way, nesting is indicated by indention, and
>  :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
8f6f95c4bd64d5f10dfddfdcd03c19d6?d=identicon&s=25 Rick Denatale (rdenatale)
on 2007-03-26 21:20
(Received via mailing list)
On 3/24/07, Christoffer Lernö <lerno@dragonascendant.com> wrote:

> Can be written
> :attribute: { :items: 2, :date: 1 }

So the OP could change this to:

attribute: {items: 2, date: 1}

On the other hand it might be nice to be able to use rails feature of
running things like these fixture yaml file's through erb/eruby first,
but that would require a facility (in the yaml module?) to produce an
inline yaml string.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/
This topic is locked and can not be replied to.