ruby-on-rails - 具有不同命名空间的模型/控制器的 Rails LoadError
问题描述
我决定对我的代码进行一些重构,因为我的一个项目开始变得非常大。因此,为了清楚起见,我决定在完全独立的模块中命名一些模型。
但是,我的控制器有一个额外的外部模块,因为所有这些模型都有不同的子域或不同类型的控制器。
因此,我有一个A::MyModel
模型app/models/a/my_model.rb
和控制器X::A::MyModelsController
和Y::A::MyModelsController
在app/controllers/x/a/my_models_controller.rb
和`app/controllers/y/a/my_models_controller.rb。
我碰巧只在某些端点上得到了一个异常LoadError: Unable to autoload constant MyModel, expected [...]/app/models/a/my_model.rb to define it
。异常很清楚,除了它应该寻找A::MyModel
.
它只发生在某些端点上,我什至设法使其适用于具有 AJAX 的端点,但不适用于 HTML。但是,它可以与 Rspecs 一起正常工作,因为我的测试都没有失败。
我怀疑这与自动加载有关,因为当它失败时,它甚至没有进入控制器:没有堆栈,Processed By xxx
日志中也没有。
我正在使用 Ruby 2.4.2、Rails 5.2.0,这是我的application.rb
require_relative "boot"
require "rails"
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
require "rails/test_unit/railtie"
Bundler.require(*Rails.groups)
module MonApp; end
class MonApp::Application < Rails::Application
config.action_view.embed_authenticity_token_in_remote_forms = true
config.generators do |generate|
generate.assets false
end
config.active_job.queue_adapter = :sidekiq
config.autoload_paths += Dir[Rails.root.join("app", "models", "**", "*")]
config.middleware.use I18n::JS::Middleware
config.exceptions_app = self.routes
end
令人惊讶的是,将 Ajax 与contentType: "application/json"
. 没有 ajax 或没有此 contentType 的相同端点似乎可以工作。
我的控制器是
class X::A::MyModelsController
def create; end
end
有人对此有一些见解吗?谢谢!
解决方案
推荐阅读
- orm - Prisma:在显式多对多关系中创建或连接记录
- apache-spark - 使用与其他 pyspark 进程共享的 pyspark 写入缓存
- javascript - Shiny - 将 Javascript 函数分配给各个链接
- r - R Shiny Reactable - 使用 updateReactable 更新复选框的选择选项在 Modal 中不起作用
- javascript - 使用请求但不是节点获取的简单帖子
- csv - TwinCAT3:写入 .txt 文件的数据与实际值一起出现乱码。我该如何防止这种情况发生?
- linux - 从远程服务器打开 VSCode 到本地,如 WSL2
- python - 转换嵌套整数列表中的 str 数字列表
- python - Plotly choropleth_mapbox 的 GeoJSON 问题
- c++ - 我的代码输出不正确,我做错了什么?