NoMethodError: undefined method `halt_callback_chains_on_return_false=' for ActiveSupport:Module

NoMethodError: undefined method `halt_callback_chains_on_return_false=' for ActiveSupport:Module

我已经开发这个 RoR 5.1 应用程序一段时间了,现在我需要添加一个新的迁移:

class AddActiveFlagToParameters < ActiveRecord::Migration[5.1]
  def change
    add_column :parameters, :is_active, :boolean, :default => true 
  end
end

当我尝试 运行 迁移时,rails 引发错误:

NoMethodError: undefined method `halt_callback_chains_on_return_false=' for ActiveSupport:Module

仔细阅读,我终于通过升级到 Rails 5.2 (gem activesupport 5.2.0) 并注释掉文件 config/initializers/new_framework_defaults.rb[ 中的行解决了这个问题。 =12=]

但这听起来像是一个短期解决方案。

这是从哪里来的?我怎样才能安全地处理这个问题?

初始化程序中的

halt_callback_chains_on_return_false 设置是升级到 Rails 5.0 后临时保留旧回调行为的解决方案。假设您需要时间检查应用程序中的所有回调,然后您可以删除此设置。并假设在升级到 5.2 时已经检查了所有内容,因此删除了此设置。

在 Rails 5 之前,从 ActiveModel 或 ActiveModel::Validations 中的任何 before_ 回调返回 false,ActiveRecord 和 ActiveSupport 导致回调链停止。

从 Rails 5.0 开始,如果有 before_ callback returns false 则回调链不会停止。要显式停止回调链,我们需要使用 throw(:abort).

因此您需要检查应用程序中所有 before_callbacks 的行为是否正确,如果需要,请更改它们,然后从初始化程序中删除此行。

你可以阅读更多here