Second time I've run into this in the past week, so I thought I'd share it with you guys. I fumbled for a short while with the extremely unhelpful error message "interning empty string error" after a re-deployment to my staging server. It seemed to be affecting all of my pages, and I couldn't really load any page.
This blog post is valid for rails 2.1.2 and rubyist-aasm 2.0.5. It may apply to other version combinations, but I make no guarantees.
First, let's dive into the error itself. This error message occurs when you call to_sym on an empty string:
john-mbp:trunk john$ irb >> "".to_sym ArgumentError: interning empty string from (irb):1:in `to_sym' from (irb):1
Now that we know what's up, let's dig into my stack trace.
to\_sym' /opt/ruby-enterprise-1.8.6-20090113/lib/ruby/gems/1.8/gems/rubyist-aasm-2.0.5/lib/persistence/active\_record\_persistence.rb:233:in aasm_read_state'
aasm\_current\_state' /opt/ruby-enterprise-1.8.6-20090113/lib/ruby/gems/1.8/gems/rubyist-aasm-2.0.5/lib/aasm.rb:50:in disabled?'
disable\_link' /var/vhosts/discovered/releases/20090213213806/app/views/schools/index.rhtml:16:in _run_erb_47app47views47schools47index46rhtml'
each' /var/vhosts/discovered/releases/20090213213806/app/views/schools/index.rhtml:12:in _run_erb_47app47views47schools47index46rhtml'
The cause of this bug is the fact that my newest build added an aasm_state column to the School model, but my migration did not properly default schools to a particular state. As such, when an instance of the model was asked for its state, the AASM codebase raised an error. And this occurred on every page because I was rendering a link to a school in a common layout.
After the fact, in SQL:
UPDATE schools SET aasm_state = 'active';
Or better yet, before the fact, in my migration:
def self.up add_column :schools, :aasm_state, :string School.reset_column_information School.update_all("aasm_state", "active") end
Don't forget that there's a difference between a migration for a yet-to-be-deployed application and a live running application. Live apps require you to take into account that data already exists.