Tag: 观察员

销毁前和相关记录销毁前的回调

我有以下型号: class PhoneNumber :destroy has_many :people, :through => :personal_phone_numbers end 我想设置一个观察者来在delayed_job队列中运行一个动作,该队列大部分都有效,但有一个例外。 我希望before_destroy观察者在被销毁之前抓住与电话号码相关联的人,并且那些人认为延迟的工作确实有效。 问题是,当电话号码被破坏时,它会先破坏:personal_phone_numbers记录, 然后在尝试销毁电话号码时触发观察者。 那时,为时已晚。 有没有办法在删除依赖记录之前观察破坏行为?

ActionMailer Observer中的Message.body为空

我正在使用Observer来记录外发电子邮件; 它正确触发,但当我尝试提取电子邮件的正文时,我得到一个空字符串。 电子邮件肯定不是空白的,并且肯定会创建日志记录。 断点和检查message.body确认它是一个空字符串。 class MailObserver def self.delivered_email(message) for address in message.to user = User.find_by_email(address) if user UserMailerLogging.create!(user_id: user.id, email_type: message.subject, contents: message.body, sent_at: Time.now) end end end end ActionMailer::Base.register_observer(MailObserver)

Rails 3:ActiveRecord观察者:after_commit回调在测试期间不会触发,但是after_save会触发

我有一个Rails 3应用程序。 我为某些模型使用了after_save回调,为其中一个模型使用了after_commit回调。 代码工作正常的所有代码,但在RSpec测试期间,当我保存Thing模型时,不会调用after_commit回调。 例如 class ThingObserver < ActiveRecord:Observer observe Thing def after_commit(thing) puts thing.inspect end end 如果我将方法名称更改为after_save ,则在测试期间将其调用为fine。 我需要能够为此特定模型使用after_commit ,因为在某些情况下,对“事物”的更改发生在Web服务器中,但观察者的效果发生在Sidekiq工作器中,而after_save不保证数据当工人做好准备时,它已经承诺并且可以使用。 RSpec的配置在spec / spec_helper.rb中如下所示 Rspec.configure do |config| #yada yada config.use_transactional_fixtures = true #yada yada end 我还调整了rake db:create以便从structure.sql文件中提取。 在lib / tasks / db.rb中 task setup: [ ‘test:ensure_environment_is_test’, ‘db:create’, ‘db:structure:load’, ‘db:migrate’, ‘db:seed’ ] 我这样做是为了让我可以运行测试以确保数据库强制执行外键约束。 有没有办法运行after_save和after_commit回调而不使Rspec use_transactional_fixtures == […]