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

Med*_*kie 39 ruby ruby-on-rails restful-authentication observer-pattern

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

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

谢谢.

par*_*pet 120

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
Run Code Online (Sandbox Code Playgroud)

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

  • 例如,`ORM`可以是`ActiveRecord :: Base`. (9认同)

Ter*_*rry 8

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

class User
  attr_accessor :skip_activation
  #whatever
end
Run Code Online (Sandbox Code Playgroud)

然后,在观察者中:

def after_save(user)
  return if user.skip_activation
  #rest of stuff to send email
end
Run Code Online (Sandbox Code Playgroud)


小智 8

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

class ActivityObserver < ActiveRecord::Observer
  observe :user

  # used in tests to disable the observer on demand.
  cattr_accessor(:disabled)
end
Run Code Online (Sandbox Code Playgroud)

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

def after_create(record)
       return if ActivityObserver.disabled
       # do_something
end
Run Code Online (Sandbox Code Playgroud)

我只是在需要时打开旗帜

ActivityObserver.disabled=true
Run Code Online (Sandbox Code Playgroud)


Nat*_*ram 6

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

config.active_record.observers = :my_model_observer unless File.basename($0) == 'rake'
Run Code Online (Sandbox Code Playgroud)