ruby-on-rails - Rails after_save 回调被多次调用

标签 ruby-on-rails ruby-on-rails-3 activerecord

我试图通过 mixin 注入(inject) after_save 回调,但我的 rspec 测试告诉我,当调用 create 方法时,该回调被调用两次。为什么该方法被调用两次?

以下 rspec 测试失败

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

失败消息是:

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

这是代码

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

Product 类有其他代码,但没有任何其他回调。

最佳答案

after_save 是事务的一部分,因此如果您还有其他需要保存的关联对象,则可能会多次调用。在这种情况下,我通常从 after_save 回调转移到 after_commit 回调,该回调仅在事务完成后运行。

关于ruby-on-rails - Rails after_save 回调被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7603448/

相关文章:

ruby-on-rails - Heroku托管的Rails应用的最佳搜索选项?

ruby-on-rails - 同一模型的多个关联

ruby-on-rails - FactoryGirl build_stubbed & RSpec - 生成 ID 但在测试 Show 操作时找不到 ID

css - 如何在 xxx.css.scss 中使用 xxx.rb 中的元素?

ruby-on-rails - 与编写用于测试的模拟相比,使用 FakeWeb 的缺点

ruby-on-rails - 在 Ruby on Rails 中,create 和 create 之间有什么区别! API 文档没有吗?

ruby-on-rails - 设计:跨子域共享 session (用户状态)

ruby-on-rails - 具有嵌入式 Ruby 的内联 Div/Table 类的精简语法

ruby-on-rails - 在 Rails 中提交后检查属性是否更改

ruby-on-rails - 在 ActiveRecord 中执行后回滚