طريقة بسيطة لإيقاف المراقبين أثناء مهمة أشعل النار؟
-
22-08-2019 - |
سؤال
أنا أستخدم Restful_authentication في تطبيقي.أقوم بإنشاء مجموعة من المستخدمين الافتراضيين باستخدام مهمة Rake، ولكن في كل مرة أقوم بتشغيل المهمة، يتم إرسال بريد إلكتروني للتنشيط بسبب المراقب المرتبط بنموذج المستخدم الخاص بي.أقوم بتعيين حقول التنشيط عندما أقوم بإنشاء المستخدمين، لذلك لا يلزم التنشيط.
هل يعرف أي شخص طريقة سهلة لتجاوز المراقبين أثناء تشغيل مهمة 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
نصائح أخرى
والقضبان 3،1 أخيرا يأتي مع API لذلك: http://api.rubyonrails.org/v3 .1.0 / فئات / ActiveModel / ObserverArray.html # طريقة ط تعطيل
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'
بشكل عام، في مثل هذه المواقف، يمكنك:
- قم بإعداد كائن وهمي "لاستيعاب" السلوك غير المرغوب فيه
- احصل على علامة/مفتاح يمكن الوصول إليه خارجيًا ويحترمه المراقبون لمنع السلوك
- أضف منطقًا إلى المراقب لاكتشاف متى يكون السلوك غير ضروري على العموم (على سبيل المثالما يقترحه دباركر)
- احصل على علامة عالمية "اختبار" أو "تصحيح" أو "بدء التشغيل" أو أي شيء يغير سلوك المستوى المنخفض
- استبطان وإزالة المراقبين
- أضف طريقة إلى النموذج الخاص بك تؤدي نسخة بديلة غير ملحوظة من المهمة (مشاركة التنفيذ مع الطريقة العادية قدر الإمكان).
في هذه الحالة، أود أن أقول أن رقم 3 هو أفضل رهان لك.
عند تشغيل الاختبارات على التطبيق أعمل على، وأنا استخدم ما يلي:
Model.delete_observers
وتعطيل مراقبون عن القضبان 3 انها بسيطة:
Rails.configuration.active_record.observers = []
ويمكنك أن تأخذ طريقة قبالة مراقب؛
MessageObserver.send(:remove_method, :after_create)
هل وقف: after_create على MessageObserver من إزالته
وأنا جئت إلى هنا بحثا عن إجابة لنفس ... أيا من بدا فوق أن تفعل خدعة (أو تنطوي مضيفا منطق الهجرة محددة إلى رمز طلبي - بو).
وإليك ما خطرت لي (عرجاء قليلا أنه يحتاج للذهاب في كل هجرة ذات الصلة، ولكن ...)
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