سؤال

أنا أستخدم 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'

بشكل عام، في مثل هذه المواقف، يمكنك:

  1. قم بإعداد كائن وهمي "لاستيعاب" السلوك غير المرغوب فيه
  2. احصل على علامة/مفتاح يمكن الوصول إليه خارجيًا ويحترمه المراقبون لمنع السلوك
  3. أضف منطقًا إلى المراقب لاكتشاف متى يكون السلوك غير ضروري على العموم (على سبيل المثالما يقترحه دباركر)
  4. احصل على علامة عالمية "اختبار" أو "تصحيح" أو "بدء التشغيل" أو أي شيء يغير سلوك المستوى المنخفض
  5. استبطان وإزالة المراقبين
  6. أضف طريقة إلى النموذج الخاص بك تؤدي نسخة بديلة غير ملحوظة من المهمة (مشاركة التنفيذ مع الطريقة العادية قدر الإمكان).

في هذه الحالة، أود أن أقول أن رقم 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)

والمزيد من المعلومات عن هذا:

تعطيل الاسترجاعات في القضبان 3

وليس هناك وسيلة واضحة لتعطيل المراقبين أن أعرف، ولكن يبدو من الممكن إضافة منطق لمراقب لعدم إرسال البريد الإلكتروني عندما يتم تعيين رمز التفعيل ...

وأما البعض الآخر قد ألمح؛ وأود أن التفاف منطق غير مرغوب فيه في المراقبة الخاصة بك مع بسيطة إذا البيان.

def after_create
  send_email if RAILS_ENV == "production"
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top