耙子任务期间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'
通常,对于这种情况,您可以:
- 设置一个模拟对象来“吸收”不需要的行为
- 有一个外部可访问的标志/开关,观察员尊重抑制行为
- 向观察者添加逻辑以检测一般情况下何时不需要的行为(例如,dbarker提出的build议)
- 有一个全球性的标志“testing”,“debugging”,“启动”或任何改变低级行为
- 反思并移除观察者
- 在你的模型中添加一个方法,执行一个替代的,未观察到的任务版本(尽可能地与普通方法共享实现)。
在这种情况下,我会说#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