40

アプリで restful_authentication を使用しています。rake タスクを使用して一連のデフォルト ユーザーを作成していますが、ユーザー モデルにオブザーバーが関連付けられているため、タスクを実行するたびにアクティベーション メールが送信されます。ユーザーを作成するときにアクティベーション フィールドを設定しているので、アクティベーションは必要ありません。

ユーザーを保存するときに電子メールが送信されないように、rake タスクの実行中にオブザーバーをバイパスする簡単な方法を知っている人はいますか?

ありがとう。

4

12 に答える 12

8

オブザーバーのフラグとして、「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
于 2011-03-10T14:19:00.337 に答える
6

あなたが試すことができる別のもの(レール3)

config.active_record.observers = :my_model_observer unless File.basename($0) == 'rake'
于 2010-12-04T22:18:11.963 に答える
2

Rails3のオブザーバーを無効にするのは簡単です。

Rails.configuration.active_record.observers = []
于 2010-10-05T10:47:23.540 に答える
2

作業中のアプリでテストを実行するときは、次を使用します。

Model.delete_observers
于 2009-04-03T04:35:13.567 に答える
2

通常、このような状況では、次のことができます。

  1. 不要な動作を「吸収」するモック オブジェクトを設定する
  2. オブザーバーが動作を禁止するために尊重する、外部からアクセス可能なフラグ/スイッチを用意する
  3. オブザーバーにロジックを追加して、一般的に動作が不要な場合を検出します(例: dbarker の提案)
  4. 「testing」、「debug」、「startup」など、低レベルの動作を変更するグローバル フラグを設定する
  5. オブザーバーをイントロスペクトして削除する
  6. 監視されていないバージョンのタスクを実行するメソッドをモデルに追加します (可能な限り通常のメソッドと実装を共有します)。

この場合、#3が最善の策だと思います。

于 2009-04-01T23:43:06.107 に答える
1

メソッドをオブザーバーから外すことができます。

MessageObserver.send(:remove_method, :after_create)

MessageObserver の :after_create を削除して停止します。

于 2010-02-10T23:24:13.713 に答える
1

私は同じことに対する答えを探してここに来ました...上記のどれもうまくいかなかったようです(または、アプリケーションコードに移行固有のロジックを追加する必要があります-ブー)。

これが私が思いついたものです(関連する移行ごとに行う必要があるのは少し不自由ですが...)

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
于 2011-01-31T19:29:54.123 に答える
1
User.skip_callback("create", :after, :send_confirmation_email)

....

User.set_callback("create", :after, :send_confirmation_email)

詳細:

Rails 3 でコールバックを無効にする

于 2012-12-13T00:40:09.643 に答える
0

他の人がほのめかしたように; オブザーバーの不要なロジックを単純なifステートメントでラップします。

def after_create
  send_email if RAILS_ENV == "production"
end
于 2009-04-02T13:46:48.667 に答える
0

私が知っているオブザーバーを無効にする簡単な方法はありませんが、アクティベーションコードが設定されているときにメールを送信しないようにオブザーバーにロジックを追加することは可能です...

于 2009-04-01T22:59:38.690 に答える