Rails LoadError для моделей / контроллеров с разными пространствами имен - PullRequest
0 голосов
/ 03 мая 2018

Я решил немного изменить рефакторинг своего кода, так как один из моих проектов стал действительно большим. Поэтому для ясности я решил назвать пространство некоторых моделей в совершенно независимых модулях.

Однако, у моих контроллеров есть дополнительный внешний модуль, так как у меня есть разные субдомены или разные виды контроллеров для всех этих моделей.

Поэтому у меня есть модель 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

Кто-нибудь знает об этом? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...