gpt4 book ai didi

ruby-on-rails - 如何修复Rails 5.1.7中的 `uninitialised constant ' ActiveRecord_Relation'`?

转载 作者:行者123 更新时间:2023-12-02 05:23:00 24 4
gpt4 key购买 nike

手头的问题

我目前正在将我们的一个项目中的 Rails 版本从 5.0.7 升级到 5.1.7,但我似乎找不到关于为什么之前工作的调用 BusinessTypes::ActiveRecord_Relation 的解释。不再起作用了。此调用作为规范的一部分执行,以便检查 Controller 是否使用正确的参数(以及具有正确类的 ActiveRecord::Relation)正确初始化 View 模型。

我尝试过的

  1. 我尝试使用rails控制台检查源代码/文件,但无济于事,因为我似乎没有找到任何源代码。我尝试过以下命令:
    • show-source BusinessTypes::ActiveRecord_Relation
    • BusinessTypes::ActiveRecord_Relation.source_location
  2. 我尝试搜索 ActiveRecord_Relation Google 和 Rails 存储库中的子类(5.0-stable 和 5.1-stable),但我没有找到任何内容,只有 ActiveRecord::Relation类本身,这并没有真正帮助解决我的问题。
  3. 我还检查了变更日志,但没有任何迹象表明它对此产生了影响。

代码洞察

测试方法BusinessTypes#index看起来像这样:

def index
@vm = BusinessTypes::Index.new(@business_types.all, current_user, address_confirmed: address_confirmed?)
end

有问题的规范如下所示:

let(:user) { create(:user) }

describe 'GET #index' do
it 'initialises the view model with the correct arguments' do
expect(BusinessTypes::Index).to receive(:new)
.with(kind_of(BusinessType::ActiveRecord_Relation), user, address_confirmed: true)
get :index
end

context 'user has not confirmed his address' do
let(:user) { create(:user, address_confirmed_at: nil) }

it 'initialises the view model with the correct arguments' do
expect(BusinessTypes::Index).to receive(:new)
.with(kind_of(BusinessType::ActiveRecord_Relation), user, address_confirmed: false)
get :index
end
end
end

预期结果与实际结果

Rails 版本 5.0.7

此测试会通过,因为 kind_of(BusinessTypes::ActiveRecord_Relation)将返回一个对象 #<RSpec::Mocks::ArgumentMatchers::KindOf:0x00007fe52529ae20 @klass=BusinessType::ActiveRecord_Relation>它与 Controller 作为参数传递的对象一致。

Rails 版本 5.1.7

我收到以下错误:NameError: uninitialized constant BusinessTypes::ActiveRecord_Relation

这两种情况之间唯一发生变化的是 Rails 版本。我有监督什么吗?感谢您的宝贵时间!

最佳答案

问题在于 ActiveRecord_Relation 被定义为 BusinessType 内的私有(private)常量。您无法在 BusinessType 之外引用它。

https://www.rubydoc.info/stdlib/core/Module:private_constant

https://github.com/rails/rails/blob/f40860800c231ecd1daef6cf6b5a8a8eda76478d/activerecord/lib/active_record/relation/delegation.rb#L25

但是您可以像这样引用它:

BusinessTypes.const_get("ActiveRecord_Relation")

但我不会在测试中以这种方式引用它。我认为更好的方法是:

expect(BusinessTypes::Index).to receive(:new).with(kind_of(BusinessType.all.class), # ...

关于ruby-on-rails - 如何修复Rails 5.1.7中的 `uninitialised constant ' ActiveRecord_Relation'`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55589454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com