【问题标题】:Rails3: Skipping callbacks from within a callbackRails3:从回调中跳过回调
【发布时间】:2012-07-04 02:44:58
【问题描述】:

我的模型中定义了以下after_save 回调。

after_save :validate_image, :publish, :update_some_data, :send_notifications

是否可以根据validate_image 中的某些条件跳过其余的after_save 回调,所以像这样 -

def validate_image
  if image_not_valid
    # skip rest of the callbacks in the after_save chain
    destroy # destroy this record
  end
end

注意:- 我也在根据该条件销毁记录,并且我有一些需要执行的“after_destroy”回调。

我正在使用带有 Mongoid v2.4.10 的 Rails v3.2.6,但我想如果它是 ActiveRecord 不会有什么不同。

【问题讨论】:

  • 我发现在回调中再次保存相同的记录会触发更多的回调,因此没有好处。可能与破坏相同的问题。除了销毁(!)什么是保存操作之外,还有更好的方法吗?
  • 如何将validate_image 移动为验证回调?
  • 我们使用 Carrierwave 进行图片上传,在“validate_image”中我们验证图片是否真的上传并且有效。我的理解是 Carrierwave 在 after_save 回调期间上传图片。
  • 是的,Carrierwave 确实在 after_save 回调中上传。你知道错误会在 after_save 中回滚事务吗?事实上,如果图像没有真正上传,Carrierwave 应该发出异常。如果您正在检查自定义内容,您可以提出自己的错误
  • 是的,这很奇怪,(对于某些图像)当我们点击上传的图像 URL 时,s3 抱怨该 URL(访问被拒绝)。这就是为什么作为后备我们正在检查上传的图像路径是否真的有效。我们通过“头部”检查来做到这一点。

标签: ruby-on-rails ruby-on-rails-3 activerecord mongoid


【解决方案1】:

像这样改变你的 before_save 定义

after_save do
   validate_image
   unless image_not_valid
       publish 
       update_some_data 
       send_notifications
   end
end

【讨论】:

    【解决方案2】:

    使用 ActiveRecord:

    http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

    如果 before_* 回调返回 false,则所有后面的回调和相关操作都将被取消。如果 after_* 回调返回 false,则后面的所有回调都将被取消

    使用常规回调,只有 before_* 回调一旦返回 false 就会停止

    【讨论】:

    • 这仅在before_* 回调中是正确的,而不是在之后:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多