3

在 Rails 应用程序(Rails 6)中,我在 Rails 应用程序的根目录中创建了一个目录 - 在/app文件夹之外。我想尝试在 Rails Web 框架之外保留一些逻辑。

- rails_root
  - app/
    - models/
    - controllers/
  - lib/
    - tasks/
  - my_domain/
    - check_record.rb

check_record.rb 文件

module MyDomain
  module CheckRecord
    def self.call(record)

    end
  end
end

现在我无法在测试(RSpec)和开发(rails 控制台)环境中自动加载这个目录。

当我尝试application.rb

config.autoload_paths += %W(#{config.root}/my_domain)

由于未初始化的常量#Class:0x00007f96e1f1ad90::MyDomain
尝试在 Rails 控制台中访问类时收到相同的错误,测试失败

当我尝试application.rb

config.paths.add "my_domain", eager_load: true, glob: "**/*.rb"

我可以看到该文件夹​​中的所有文件都已注册Rails.configuration.eager_load_paths,但测试失败并显示相同的错误消息

当我将此代码移动到专用初始化程序类相同的输出或运行 Rails 控制台初始化程序时根本没有加载。

域类型的用法:

class MyRecord < ApplicationRecord
  def check
    MyDomain::CheckRecord.call(self)
  end
end

如何在文件夹外使用 ruby​​ 文件急切或自动加载目录/app

4

1 回答 1

2

我相信您正在使用 zeitwerk 自动加载器,这是 Rails 6 中的默认设置。在这种情况下,您的 check_record.rb 文件应该是

module CheckRecord
  def self.call(record)

  end
end

它应该这样称呼

class MyRecord < ApplicationRecord
  def check
    CheckRecord.call(self)
  end
end

有关详细信息,请参阅https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#project-structure

于 2020-10-12T06:05:29.380 回答