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
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
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
1\n"
irb(main):006:0> puts ({:attribute => {:date => 1, :items => 2}}.to_yaml)
···
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
1
I did some googling and was under the impression nested hashes are
okay... I get the feeling that is wrong...
---
: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/
If one wants to put a hash (or an array) on a single line with yaml, you need to use the {} / format.
So this:
···
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
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
1\n"
irb(main):006:0> puts ({:attribute => {:date => 1, :items => 2}}.to_yaml)
---
:attribute:
:items: 2
1
=> nil
Not sure what the solution is, but I think that's the problem.
---
:attribute:
:items: 2
:date: 1
Can be written
:attribute: { :items: 2,
1 }
I.e.
YAML::load(":attribute: { :items: 2,
1 }")
=> {:attribute=>{:items=>2, :date=>1}}
YAML::load("---\n:attribute:\n :items: 2\n
1")
=> {:attribute=>{:items=>2, :date=>1}}
/Christoffer
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.
···
On 3/24/07, Christoffer Lernö <lerno@dragonascendant.com> wrote:
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,
1 }
--
Rick DeNatale
My blog on Ruby
http://talklikeaduck.denhaven2.com/