Rails after_save retorno de chamada sendo chamado várias vezes

10

Estou tentando injetar um callback after_save por meio de um mixin, mas meus testes rspec estão me informando que o retorno de chamada está sendo chamado duas vezes quando o método create é chamado. Por que o método está sendo chamado duas vezes?

O teste rspec a seguir falha

it 'should call callback' do
  Product.any_instance.should_receive(:update_linkable_attachments).once
  Product.create(:name=>'abc')
end

A mensagem de falha é:

Failure/Error: Unable to find matching line from backtrace
   (#<Product:0xb7db738>).update_linkable_attachments(any args)
       expected: 1 time
       received: 2 times

Aqui está o código

module MainModuleSupport
  def self.included(base)
    base.instance_eval("after_save :update_linkable_attachments")
  end 

  def update_linkable_attachments
    LinkedAttachment.delay.create_from_attachment self
  end
end

class Product < ActiveRecord::Base
  include MainModuleSupport
  ...

end

A classe Product possui outro código, mas não possui outros retornos de chamada.

    
por Brian Glick 29.09.2011 в 23:13
fonte

1 resposta

7

after_save faz parte da transação e, portanto, pode ser chamado mais de uma vez, desde que você tenha outros objetos associados que também precisem ser salvos. Em casos como esse, normalmente, mudo do retorno de chamada after_save para o retorno de chamada after_commit, que é executado somente após a conclusão da transação.

    
por heavysixer 06.11.2011 / 21:52
fonte