耙子任务期间closures观察者的简单方法?

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

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

谢谢。

你可以添加一个访问器到你的用户模型,像“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 

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

作为观察者的标志,我喜欢定义一个名为“disabled”的类访问器,所以它读起来像这样:

 class ActivityObserver < ActiveRecord::Observer observe :user # used in tests to disable the observer on demand. cattr_accessor(:disabled) end 

我把它作为敏感callback的一个条件

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

我只是在需要的时候打开旗帜

 ActivityObserver.disabled=true 

另一个你可以尝试(导轨3)

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

通常,对于这种情况,您可以:

  1. 设置一个模拟对象来“吸收”不需要的行为
  2. 有一个外部可访问的标志/开关,观察员尊重抑制行为
  3. 向观察者添加逻辑以检测一般情况下何时不需要的行为(例如,dbarker提出的build议)
  4. 有一个全球性的标志“testing”,“debugging”,“启动”或任何改变低级行为
  5. 反思并移除观察者
  6. 在你的模型中添加一个方法,执行一个替代的,未观察到的任务版本(尽可能地与普通方法共享实现)。

在这种情况下,我会说#3是你最好的select。

在我正在使用的应用程序上运行testing时,我使用以下内容:

 Model.delete_observers 

禁用Rails 3的观察者很简单:

 Rails.configuration.active_record.observers = [] 

你可以采取观察员的方法;

 MessageObserver.send(:remove_method, :after_create) 

将通过删除MessageObserver来停止:after_create。

我来到这里寻找同样的答案…以上都没有似乎做的伎俩(或涉及添加特定于迁移的逻辑到我的应用程序代码 – 嘘)。

这就是我提出的(有点跛脚,它需要在每个相关的迁移,但…)

 class ChangeSomething < ActiveRecord::Migration # redefine... class MessageObserver < ActiveRecord::Observer def after_create(observed) ; end def after_update(observed) ; end end def self.up # Message create/update stuff... end end 
 User.skip_callback("create", :after, :send_confirmation_email) .... User.set_callback("create", :after, :send_confirmation_email) 

更多关于这个:

禁用Rails中的callback3

有没有一种简单的方法来禁用我所知道的观察者,但是当激活码被设置时,向观察者添加逻辑以不发送电子邮件听起来是可能的…

正如其他人暗示的那样; 我会用一个简单的if语句将不需要的逻辑包装在Observer中。

 def after_create send_email if RAILS_ENV == "production" end