我使用的restful_authentication在我的应用程序。我创建一个组默认的用户使用耙的任务,但我每次执行任务的一个激活电子邮件发送出去,因为观察员与我的用户模型。我设置激活领域当我创造的用户,因此没有激活是必要的。

任何人都知道的一个简单的方法绕过观察员,同时在运行一个瑞克的任务使没有电子邮件获得发送出去的时候我保存的用户?

谢谢。

有帮助吗?

解决方案

您可以访问器添加到您的用户模型,像“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的Rails最后附带此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

另外一个可以尝试(轨道3)

config.active_record.observers = :my_model_observer unless File.basename($0) == 'rake'

在一般来说,对这些各种各样的情况下,你可以:

  1. 设立了一个模拟对象,以"吸收"不必要的行为
  2. 有一个外部访问标志/开关于该观察员关于抑制行为
  3. 添加逻辑的观察者检测当行为是不需要的 在一般 (例如什么dbarker建议)
  4. 有一个全球性的标记"测试","调试","启动"或任何改变低级行为
  5. 进行内部检查,并删除的观察员
  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)

更多内容:

禁用回调中的Rails 3

有没有禁用,我知道的观察者直接的方式,但它听起来可能逻辑添加到您的观察者时激活码设置为不发送电子邮件...

正如其他人暗示;我想包不必要的逻辑在你的观察与如果简单的语句。

def after_create
  send_email if RAILS_ENV == "production"
end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top