简单的方式关闭,观察员在耙任务?
-
22-08-2019 - |
题
我使用的restful_authentication在我的应用程序。我创建一个组默认的用户使用耙的任务,但我每次执行任务的一个激活电子邮件发送出去,因为观察员与我的用户模型。我设置激活领域当我创造的用户,因此没有激活是必要的。
任何人都知道的一个简单的方法绕过观察员,同时在运行一个瑞克的任务使没有电子邮件获得发送出去的时候我保存的用户?
谢谢。
解决方案
您可以访问器添加到您的用户模型,像“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.1的Rails最后附带此API: http://api.rubyonrails.org/v3 .1.0 /类/加载ActiveModel / ObserverArray.html#方法-I-禁用
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
至于我喜欢,所以它读取这样定义一个类访问器称为“无效”观察者的标志:
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
另外一个可以尝试(轨道3)
config.active_record.observers = :my_model_observer unless File.basename($0) == 'rake'
在一般来说,对这些各种各样的情况下,你可以:
- 设立了一个模拟对象,以"吸收"不必要的行为
- 有一个外部访问标志/开关于该观察员关于抑制行为
- 添加逻辑的观察者检测当行为是不需要的 在一般 (例如什么dbarker建议)
- 有一个全球性的标记"测试","调试","启动"或任何改变低级行为
- 进行内部检查,并删除的观察员
- 添加的一种方法模型,执行替换,未观察到的版本的任务(共享的执行情况与正常的方法尽可能)。
在这种情况下,我会说#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)
更多内容:
有没有禁用,我知道的观察者直接的方式,但它听起来可能逻辑添加到您的观察者时激活码设置为不发送电子邮件...
正如其他人暗示;我想包不必要的逻辑在你的观察与如果简单的语句。
def after_create
send_email if RAILS_ENV == "production"
end