Pergunta

Estou tentando acompanhar o tópico sobre a implementação de um sistema de conquista (localizado em Como implementar um sistema de conquista no ROR), e estou encontrando um TypeError quando o objeto é salvo e o método concedido? é chamado. O erro parece:

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?'

A lógica do modelo é exatamente como definida nessa pergunta anterior:

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

Alguma ideia do que está acontecendo aqui?

ATUALIZAR: Com base nas informações abaixo, acabei removendo a abstração e colocando os métodos de premiação diretamente em cada controlador por enquanto. Não muito seco e, quando tiver tempo para brincar com isso, mais tentarei abstraí -lo novamente, mas funciona por enquanto. Um exemplo:

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

Solução

Não tenho certeza do problema exato, mas parece que o que está sendo fornecido ao método que está atribuindo a conquista está errado, o que está fazendo com que o valor do 'tipo' seja armazenado incorretamente. Verifique seu banco de dados e verifique se o valor está sendo gravado para 'tipo' é uma subclasse do seu pai, e não o pai (ou qualquer outro valor incorreto).

Se esse valor for armazenado incorretamente os trilhos não poderão instanciar um objeto e deve procurar esse valor antes de tentar criar o objeto, e é por isso que está lançando esse erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top