views:

1637

answers:

2

Has anyone had any problems using the AASM state machine Gem with Rails 2.3.2? It was working fine for me but is now giving a NoMethodError:

NoMethodError (undefined method `state' for #<Comment:0x25cb8ac>):
  /usr/local/lib/ruby/gems/1.8/gems/rubyist-aasm-2.0.5/lib/persistence/active_record_persistence.rb:231:in `send'
  /usr/local/lib/ruby/gems/1.8/gems/rubyist-aasm-2.0.5/lib/persistence/active_record_persistence.rb:231:in `aasm_read_state'
  /usr/local/lib/ruby/gems/1.8/gems/rubyist-aasm-2.0.5/lib/persistence/active_record_persistence.rb:135:in `aasm_current_state'
  /usr/local/lib/ruby/gems/1.8/gems/rubyist-aasm-2.0.5/lib/persistence/active_record_persistence.rb:156:in `aasm_ensure_initial_state'
 app/controllers/comments_controller.rb:12:in `create'

Here's the relevant code from my model that uses AASM:

class Comment < ActiveRecord::Base
  include AASM
  belongs_to :post          
  after_create :spam_check

  aasm_column :state
  aasm_initial_state :submitted
  aasm_state :submitted
  aasm_state :approved
  aasm_state :rejected

  aasm_event :ham do
    transitions :to => :approved, :from => [:submitted, :rejected]
  end

  aasm_event :spam do
    transitions :to => :rejected, :from => [:submitted, :approved]
  end     

  private          
  def spam_check
    # Invoke Askismet to see if the comment is spam...
  end
end

Note that I have the state column in my comments table.

  • Any ideas why it no longer works?
+1  A: 

From the aasm home page it appears that, as at time of writing, there's an update coming...

There's a little discussion on the Ruby on Rails group - I don't know if any of that helps.

Executing

gem list .*aasm --remote

threw up a bunch of references:

aasmith-yodlee (0.0.1.20090301132701)
bloom-aasm (2.0.3)
bloom-bloom-aasm (2.0.3)
caleb-aasm (2.0.2)
dunedain289-aasm (2.1.3)
dvdplm-aasm (2.0.6)
eric-aasm (2.0.4)
factorylabs-aasm (2.0.5.2)
gvaughn-aasm (2.0.4)
lostboy-aasm (2.0.5.1)
mikowitz-aasm (2.0.6)
netguru-aasm (2.0.6)
notch8-aasm (2.0.5)
rubyist-aasm (2.0.5)
runcoderun-aasm (2.0.5.1)
snoozer05-aasm (2.0.2)
spicycode-aasm (2.0.0)

It suspect that some or all of the "dvdplm-", "factorylabs-" and "runcoderun-" ones may be git forks. You may find that one or more fixes your problem.

Mike Woodhouse
Thanks Mike. I tried swapping out rubyist-aasm for factorylabs-aasm, but it still doesn't work. I'm going to try creating a brand new Rails project with a simple state machine model and see if it works for that.
John Topley
+2  A: 

Uh, you need a field in your comments table called 'state'. You defined it using aasm_column :state. This is not a Rails 2.3.2 bug! :D

Ryan Bigg
I have that column in my comments table.
John Topley
It turns out that I didn't have that column after all! It was defined in my migration and schema.rb, but I'm also running a SQL file to pre-populate the database and that had got slightly out of sync and was dropping the "state" column.
John Topley