Rails Rails 5 需要用 throw (:abort) 终止回调执行,官方文档未更新,坑……

charleszhang · 2016年11月29日 · 最后由 hiveer 回复于 2019年05月24日 · 2440 次阅读

通过 false 终止回调执行不起作用,google 一番未果,怒跟源码,发现如下:

activesupport-5.0.0.1/lib/active_support/callbacks.rb

def deprecated_false_terminator # :nodoc:
  Proc.new do |target, result_lambda|
    terminate = true
    catch(:abort) do
      result = result_lambda.call if result_lambda.is_a?(Proc)
      if Callbacks.halt_and_display_warning_on_return_false && result == false
        display_deprecation_warning_for_false_terminator
      else
        terminate = false
      end
    end
    terminate
  end
end

需要用 throw(:abort) 终止回调执行,官方文档还未更新

http://guides.rubyonrails.org/active_record_callbacks.html#halting-execution

国外一哥们的总结:

http://blog.bigbinary.com/2016/02/13/rails-5-does-not-halt-callback-chain-when-false-is-returned.html

不知道对于 ActionMailer, ActionController 的 callbacks 是不是一样的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号