【问题标题】:Rails seeds.rb: How can I skip multiple callbacks using Class.skip_callback?Rails seed.rb:如何使用 Class.skip_callback 跳过多个回调?
【发布时间】:2015-02-13 15:46:42
【问题描述】:

在我的seeds.rb 文件中,我正在创建多个 Job 类的对象。 Job 有这些回调:

class Job < ActiveRecord::Base
...
after_create :notify_by_email, :notify_by_text
...
end

我想避免在开发和暂存中生成这些电子邮件或文本消息(开发当前使用的是 LetterOpener,在我的浏览器中弹出这些电子邮件很痛苦。我只想能够运行 rake db:seed 并忽略终端)。在 StackOverflow 上的另一个问题中,我发现我可以使用它:

Job.skip_callback(:create, :after, :notify_by_email)

所以我尝试了以下方法在一行中跳过两个回调:

Job.skip_callback(:create, :after, { :notify_by_email, :notify_by_text })

但是,这引发了错误。我检查了ActiveSupport API,但它并没有表明可以做我想做的事情,所以我求助于这个:

  Job.skip_callback(:create, :after, :notify_by_email)
  Job.skip_callback(:create, :after, :notify_by_text)

有没有一种方法可以更像上面的回调散列尝试?

【问题讨论】:

    标签: ruby-on-rails ruby callback arguments activesupport


    【解决方案1】:

    您可能会混淆 skip_before_filter (它是控制器中的类似表亲)。

    您可以通过添加 :if 或 :unless 选项来跳过 after_create

    after_create :notifiy_by_email, if: :new_user
    
    def new_user
      # logic to determine if user is new
    end
    

    我还建议您将电子邮件发送到控制器并避免整个问题。

    【讨论】:

    • 谢谢。这可能是我需要的,尽管不触发回调需要满足的条件是对象是通过seeds.rb 文件创建的。我想我可以使该方法成为测试Rails.env.development? 的东西?
    【解决方案2】:

    我想你要找的是reset_callbacks

    Job.reset_callbacks(:create)
    

    看到这个http://apidock.com/rails/ActiveSupport/Callbacks/ClassMethods/reset_callbacks

    【讨论】:

    • 这看起来与我需要的相似,但我认为它可能太强大了,因为它删除了所有回调。当通过seeds.rb 创建对象时,我有一些after_create 回调,但不是全部
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多