views:

93

answers:

1

I'm trying to follow along with the thread on implementing an achievement system (located at http://stackoverflow.com/questions/885277/how-to-implement-an-achievement-system-in-ror), and am running into a TypeError when the object is saved and the method awarded? gets called. The error looks like:

TypeError (can't dump anonymous class Class):
  /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/yaml/rubytypes.rb:6:in `to_yaml'
  app/models/user.rb:18:in `awarded?'

The model logic is exactly as defined in that previous question:

  def awarded?(achievement)
    achievements.count(:conditions => { :type => achievement }) > 0
  end

Any idea what's happening here?

UPDATE: Based on the info below, I ended up removing the abstraction and placing the award methods directly in each controller for now. Not very DRY and when I have time to play around with it more I'll try to abstract it out again, but works for now. An example:

if @user.achievements.count(:conditions => { :type => "CommentAchievement" }) < 1 and @comments > 1000
  @user.achievements << CommentAchievement.new(:group_id => @group)
end
+1  A: 

Not sure of the exact problem but it looks like whatever is being provided to the the method that is assigning the achievement is wrong, which is causing the value of 'type' to be stored incorrectly. Check your database and make sure that the value being written to 'type' is a subclass of your parent, and not the parent (or any other incorrect value).

If that value is stored incorrectly rails will not be able to instantiate an object, and it must look that value up before it attempts to create the object which is why its throwing that error.

Rabbott