簡単にoffにオブザーバー中のキタ?
-
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
他のヒント
のRails 3.1がついにこのために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
もう1(レール3)
config.active_record.observers = :my_model_observer unless File.basename($0) == 'rake'
では、このような状況では以下の操作が可能です。
- 模擬オブジェクト"吸収"、不要な行動
- て外部からのアクセスフラグ/スイッチのオブザーバーの尊重を阻害する挙動
- 追加すが、"ロジカル(論理的)である、オブザーバーを検出するための動作は不要な 一般 (例:何dbarkerことを示唆)
- グローバルなフラグ"試験"、"debug","起動"または何に変化する低レベルの挙動
- Introspect、オブザーバー
- 追加手法のモデルを実行する際の観測のタスク共有の実装を通常の方法などもできます)。
この場合、僕#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)
この上よります:
レール3 の
私が知っているオブザーバーを無効にする簡単な方法はありませんが、それは電子メールを送信しないためにあなたの観察者にロジックを追加することが可能に聞こえるアクティベーションコードが設定されている場合...
他の人が示唆したように、私は、単純なif文であなたのオブザーバーに不要なロジックをラップなります。
def after_create
send_email if RAILS_ENV == "production"
end