Fun with Syck and Psych on Heroku

This is one of those posts that's inspired by a desire never to have to investigate the same bug again.

I just deployed an app to Heroku that needs to read its data from a local YAML file in order to function. It runs fine on my Mac, but fails with this message on Heroku:

ActionView::Template::Error (undefined method `downcase' for #<Syck::PrivateType:0x000000043df398>)

Ouch. I was supposed to be calling downcase on a string. The YAML file on Heroku is identical to the one that I'm using on my Mac, so what's going on?

Thanks to Alessandro Di Maria, I spotted that Heroku's Cedar stack is still using Sych to parse YAML, rather than the newer Psych. You can investigate what you're running like this:

$ rails console
Loading development environment (Rails 3.2.5)
irb(main):001:0> YAML::ENGINE::yamler
=> "psych"

$ heroku run console
Connecting to database specified by DATABASE_URL
Loading production environment (Rails 3.2.5)
irb(main):001:0> YAML::ENGINE::yamler
=> "syck"

Feck. Rails 3 will use Psych by default if it can find it. Psych will be enabled automatically if you compile Ruby with libyaml installed, but (luckily) you can also add psych to your Gemfile to force it.

$ echo "gem 'psych' >> Gemfile" && bundle

Problem solved. Cheers Alessandro!

I love feedback and questions — please get in touch on Twitter or leave a comment.