当前位置:  开发笔记 > 后端 > 正文

在耙子任务期间关闭观察员的简单方法?

如何解决《在耙子任务期间关闭观察员的简单方法?》经验,为你挑选了4个好方法。

我在我的应用程序中使用restful_authentication.我正在使用rake任务创建一组默认用户,但每次运行任务时都会因为与我的用户模型关联的观察者而发送激活电子邮件.我在创建用户时设置激活字段,因此不需要激活.

任何人都知道在运行rake任务时绕过观察者的简单方法,以便在我保存用户时不会发送电子邮件?

谢谢.



1> parapet..:

Rails 3.1最终附带了API:http: //api.rubyonrails.org/v3.1.0/classes/ActiveModel/ObserverArray.html#method-i-disable

ORM.observers.disable :user_observer
  # => disables the UserObserver

User.observers.disable AuditTrail
  # => disables the AuditTrail observer for User notifications.
  #    Other models will still notify the AuditTrail observer.

ORM.observers.disable :observer_1, :observer_2
  # => disables Observer1 and Observer2 for all models.

ORM.observers.disable :all
  # => disables all observers for all models.

User.observers.disable :all do
  # all user observers are disabled for
  # just the duration of the block
end

ORM例如,哪里可以ActiveRecord::Base


例如,`ORM`可以是`ActiveRecord :: Base`.

2> Terry..:

您可以为用户模型添加一个访问器,例如"skip_activation",不需要保存,但会在会话中持续存在,然后检查观察者中的标志.就像是

class User
  attr_accessor :skip_activation
  #whatever
end

然后,在观察者中:

def after_save(user)
  return if user.skip_activation
  #rest of stuff to send email
end



3> 小智..:

作为观察者的标志,我喜欢定义一个名为"disabled"的类访问器,所以它如下所示:

class ActivityObserver < ActiveRecord::Observer
  observe :user

  # used in tests to disable the observer on demand.
  cattr_accessor(:disabled)
end

我把它作为敏感回调中的一个条件

def after_create(record)
       return if ActivityObserver.disabled
       # do_something
end

我只是在需要时打开旗帜

ActivityObserver.disabled=true



4> 小智..:

另一个你可以尝试(rails 3)

config.active_record.observers = :my_model_observer unless File.basename($0) == 'rake'

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有