Rails seeds.rb:如何使用Class.skip_callback跳过多个回调?

时间:2015-02-13 15:46:43

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

在我的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)

有没有办法更好地使用回调散列的上述尝试?

2 个答案:

答案 0 :(得分:2)

你可能会混淆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

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

答案 1 :(得分:1)

我认为你要找的是reset_callbacks

Job.reset_callbacks(:create)

请参阅此http://apidock.com/rails/ActiveSupport/Callbacks/ClassMethods/reset_callbacks