在 Rails 7.1 中调用服务类方法时出错

Eas*_*per 1 ruby-on-rails zeitwerk

轨道7.1

在我的应用程序/服务/工具中,我有一个文件:services_tools.rb

在 services_tools.rb 中,我有:

module ServicesTools
  class ErbToSlim
    def convert_erb_to_slim(erb_file)
      ...........
    end
  end

  class NestedMigrationCreator
    def generate_nested_migration(migration_namespace:, migration_name:, migration_code: nil)
      ..........
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我进入命令行,然后执行以下操作:

rails c
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

creator = ServicesTools::NestedMigrationCreator.new
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:

(irb):1:in `<main>': uninitialized constant ServicesTools (NameError)
Run Code Online (Sandbox Code Playgroud)

在控制台中,当我这样做时:

ActiveSupport::Dependencies.autoload_paths
Run Code Online (Sandbox Code Playgroud)

我得到:

"/lib",
"/test/mailers/previews",
"/app/channels",
"/app/controllers",
"/app/controllers/concerns",
"/app/helpers",
"/app/jobs",
"/app/mailers",
"/app/models",
"/app/models/concerns",
"/app/services",
...
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Ale*_*lex 5

app/services目录,这意味着与该目录相关的文件必须与模块/类名称相对应才能自动加载:

# app/services/tools/services_tools.rb
#              '^^^' '^^^^^^^^^^^^'
#                |         |  
module Tools # --'         |
  module ServicesTools # --'
  end
end
Run Code Online (Sandbox Code Playgroud)

这看起来有点尴尬。这可能会更好:

# app/services/tools/erb_to_slim.rb
module Tools
  class ErbToSlim
  end
end

# app/services/tools/nested_migration_creator.rb
module Tools
  class NestedMigrationCreator
  end
end
Run Code Online (Sandbox Code Playgroud)

一般来说,最好为每个文件定义一个常量。但是,这也有效,只要文件名对应于类/模块名称,您就可以在其中执行任何操作:

# app/services/tools.rb

module Tools
  class ErbToSlim
  end

  class NestedMigrationCreator
  end
end
Run Code Online (Sandbox Code Playgroud)

https://github.com/fxn/zeitwerk#file-struct