在本地使用ActiveRecord :: NullMutationTracker:Class的Rails未定义局部变量或方法“ first” 堆栈

问题描述

当我们调用任何类似的方法时,我们在项目的所有本地设置(当前)上都会收到此错误

belongs_to :abc
after_create :some_method

def some_method
  if self.abc.saved_change_to_parent_id?
  ...
  // or even self.abc.parent_id_before_last_save
end

它给出:

NameError (undefined local variable or method `first' for ActiveRecord::NullMutationTracker:Class):

app/models/model_name.rb:50:in `some_method'

是的,没有包含rails内部文件路径等的完整跟踪,我仅获得我的项目文件跟踪。也许是某些记录器配置问题,对获得完整跟踪的任何帮助也将不胜感激。

我在互联网上找不到这些问题,这就是为什么在这里发布。

PS:因为我的复制量很少,所以未发布在rails问题跟踪器(github问题)上。

堆栈

红宝石:2.4.3
rails:5.1.5(也在5.1.7上尝试过)
操作系统:Ubuntu 20,也在macOS上尝试过

谢谢。

UPDATE1 :使用byebug,我进入了发生错误的跟踪:

/Users/dev/.rvm/gems/ruby-2.4.3/gems/acts_as_singleton-0.0.8/lib/acts_as_singleton.rb:43

它是here,因此它不是直接来自rails,而是由于某种原因我们在代码中包含的非常过时的gem。

解决方法

正如我在更新中发布的那样,问题不在于导轨或其他任何东西,我使用了byebug来跟踪跟踪,它类似于:

activemodel-5.1.5/lib/active_model/attribute_methods.rb:384
activerecord-5.1.5/lib/active_record/attribute_methods/dirty.rb:146
activerecord-5.1.5/lib/active_record/attribute_methods/dirty.rb:319
activerecord-5.1.5/lib/active_record/attribute_methods/dirty.rb:315
acts_as_singleton-859f49112c03/lib/acts_as_singleton.rb:43

最后一行不应出现,因为我们没有在任何涉及的模型上使用acts_as_singleton

因此,在进行了一些跟踪之后,发现宝石有问题。我创建了一个叉子,并使用了那个叉子。这是分叉:https://github.com/ziaulrehman40/acts_as_singleton(是从另一个分叉中分叉的,该分叉似乎也有其他修复程序)。您可以看到我的更改here

出了什么问题?

此gem在Singleton模块内编写了一个名为ActiveRecord的模块。除非您意识到已经有另一个名为Singleton的模块,否则这似乎还可以。 Whihc被包含在:

gems/activerecord-5.1.5/lib/active_record/attribute_mutation_tracker.rb:83

class NullMutationTracker # :nodoc:
    include Singleton
...

如您所见,此Singleton模块被过时的gem(acts_as_singleton)意外覆盖(或不确定扩展)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...