I figured I’d post here before submitting a ticket, but I’m seeing some
confusing stuff when dealing with YAML now. I was using it to freeze
objects in my database, and so i had some data already around to mess
with.
I upgraded both Ruby (1.8.3 -> 1.8.4) and Rails ( -> 1.1RC1) and this
junk
started. I’ve outlined the problem in two pastes, which I’ll paste
below.
----1
This was already saved in my database, pre 1.8.3 -> 1.8.4, and pre
Rails 1.1RC1
c.lawsuit.customer_service_location
=> “— !ruby/object:Address \nattributes: \n created_on: 2006-02-24
12:30:19\n city: Alex City\n line1: 441 Saint Bernard Drive\n zip:
“35086”\n line2: ‘’\n id: “124”\n contact_detail_id: “128”\n
detail_key: Home Address\n state: AL”
And I created this YAML object from the same data.
ay
=> “— !ruby/object:Address \nattributes: \n created_on: 2006-02-24
12:30:19\n city: Alex City\n line1: 441 Saint Bernard Drive\n zip:
“35086”\n line2: “”\n id: “124”\n contact_detail_id:
“128”\n detail_key: Home Address\n state: AL\n”
You can see that line2 is treated differently between the two objects.
Also, there’s no trailing \n on the first object created.
Similarly, when I try a YAML.load of the first object on my machine
(1.8.4, 1.1RC1) I get this:
YAML.load c.lawsuit.customer_service_location
=> #<YAML::Object:0xb7986eb8 @class=“Address”,
@ivars={“attributes”=>{“line1”=>“441 Saint Bernard Drive”,
“city”=>“Alex City”, “created_on”=>“2006-02-24 12:30:19”, “line2”=>"",
“zip”=>“35086”, “id”=>“124”, “state”=>“AL”, “detail_key”=>“Home
Address”, “contact_detail_id”=>“128”}}>
But when I load the same object on the server (Ruby 1.8.2, Rails 1.0)
I get this:
YAML.load c.lawsuit.customer_service_location
=> #<Address:0x8ebc0ec @attributes={“line1”=>“441 Saint Bernard
Drive”, “city”=>“Alex City”, “created_on”=>“2006-02-24 12:30:19”,
“line2”=>"", “zip”=>“35086”, “id”=>“124”, “state”=>“AL”,
“detail_key”=>“Home Address”, “contact_detail_id”=>“128”}>
Is this a bug in Ruby? Rails? My logic?
----2
This is the same yaml string from before…
YAML.load c.lawsuit.customer_service_location
=> #<YAML::Object:0xb79cceb8 @class=“Address”,
@ivars={“attributes”=>{“line1”=>“441 Saint Bernard Drive”,
“city”=>“Alex City”, “created_on”=>“2006-02-24 12:30:19”, “line2”=>"",
“zip”=>“35086”, “id”=>“124”, “state”=>“AL”, “detail_key”=>“Home
Address”, “contact_detail_id”=>“128”}}>
Here I guess we load the Address model for the first time
a = Address.find 185
=> #<Address:0xb79076ac @attributes={“created_on”=>“2006-03-14
20:48:13”, “city”=>“Birmingham”, “line1”=>“1775 Ridgeview Lake Road”,
“zip”=>“35222”, “line2”=>"", “id”=>“185”, “contact_detail_id”=>“187”,
“detail_key”=>“Home Address”, “state”=>“AL”}>
Try to load the previous YAML string this time, and error…
YAML.load c.lawsuit.customer_service_location
NoMethodError: You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occured while evaluating nil.include?
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/base.rb:1511:in
respond_to?' from /usr/local/lib/ruby/1.8/yaml.rb:133:in
load’
from (irb):5
from :0