質問

を使用してい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'

では、このような状況では以下の操作が可能です。

  1. 模擬オブジェクト"吸収"、不要な行動
  2. て外部からのアクセスフラグ/スイッチのオブザーバーの尊重を阻害する挙動
  3. 追加すが、"ロジカル(論理的)である、オブザーバーを検出するための動作は不要な 一般 (例:何dbarkerことを示唆)
  4. グローバルなフラグ"試験"、"debug","起動"または何に変化する低レベルの挙動
  5. Introspect、オブザーバー
  6. 追加手法のモデルを実行する際の観測のタスク共有の実装を通常の方法などもできます)。

この場合、僕#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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top