TypeError ao tentar usar observadores e STI
-
20-09-2019 - |
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
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.