我在我的应用程序中使用了 restful_authentication。我正在使用 rake 任务创建一组默认用户,但是每次我运行该任务时,都会发送一封激活电子邮件,因为观察者与我的用户模型相关联。我在创建用户时设置了激活字段,因此不需要激活。
任何人都知道在运行 rake 任务时绕过观察者的简单方法,以便在我保存用户时不会发送电子邮件?
谢谢。
我在我的应用程序中使用了 restful_authentication。我正在使用 rake 任务创建一组默认用户,但是每次我运行该任务时,都会发送一封激活电子邮件,因为观察者与我的用户模型相关联。我在创建用户时设置了激活字段,因此不需要激活。
任何人都知道在运行 rake 任务时绕过观察者的简单方法,以便在我保存用户时不会发送电子邮件?
谢谢。
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
您可以向您的用户模型添加一个访问器,例如“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
作为观察者的标志,我喜欢定义一个名为“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
另一个你可以尝试的(rails 3)
config.active_record.observers = :my_model_observer unless File.basename($0) == 'rake'
一般来说,对于这些情况,您可以:
在这种情况下,我会说#3 是你最好的选择。
在我正在开发的应用程序上运行测试时,我使用以下内容:
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)
更多关于这个:
据我所知,没有一种简单的方法可以禁用观察者,但听起来可以向您的观察者添加逻辑,以便在设置激活码时不发送电子邮件......
正如其他人所暗示的那样;我会用一个简单的 if 语句将不需要的逻辑包装在您的 Observer 中。
def after_create
send_email if RAILS_ENV == "production"
end