нельзя загружать модели внутри устанавливаемого двигателя на рельсы

У меня есть проект rails, в котором используется mongo db, и я написал монтируемый движок с именем «report_service».

Я использовал это так в проекте main rails:

gem 'report_service', :git => '[email protected]:report_service.git', :branch => :master, :require => false

Я не хочу, чтобы этот гем загружался при инициализации проекта rails, поэтому я добавил параметр :require => false.

Но в моей консоли rails после выполнения require 'report_service' я не могу найти модели в этом геме.

[1] pry(main)> ReportService
=> ReportService
[2] pry(main)> ReportService::Engine
NameError: uninitialized constant ReportService::Engine
from (pry):2:in `<main>'
[3] pry(main)> require 'report_service'
=> true
[4] pry(main)> ReportService::Engine
=> ReportService::Engine
[5] pry(main)> ReportService::RsExam
NameError: uninitialized constant ReportService::RsExam
from (pry):5:in `<main>'

Вот мой каталог драгоценных камней report_service и код:

report_service/lib/report_service.rb

require "active_record/railtie"
require "report_service/engine"
module ReportService
end

report_service/lib/report_service/engine.rb

module ReportService
  class Engine < ::Rails::Engine
   isolate_namespace ReportService
  end
end

report_service/приложение/модели/report_service/rs_exam.rb

module ReportService
  class RsExam < ActiveRecord::Base
  end
end

person Richie Min    schedule 12.08.2013    source источник
comment
Вы пытались загрузить свой драгоценный камень при инициализации? а потом пробовать?   -  person SD1990    schedule 15.08.2013
comment
это нормально, если я удалю ':required =› false', но я не хочу этого   -  person Richie Min    schedule 15.08.2013


Ответы (1)


Отмените это обновление. Просто добавьте require "report_service/rs_exam" в свой report_service.rb.

require "active_record/railtie"
require "report_service/engine"
require "report_service/rs_exam"
module ReportService
end

Я полагаю, что происходит то, что вы загружаете модель report_service/rs_exam, поэтому вы получите неинициализированную постоянную ошибку. Потому что, глядя на вывод консоли.

Загрузка драгоценного камня работает нормально.

require 'report_service'
=> true

ReportService::Engine загружается нормально.

[4] pry(main)> ReportService::Engine
=> ReportService::Engine

Но тогда, когда вы пытаетесь загрузить rs_exam

[5] pry(main)> ReportService::RsExam
NameError: uninitialized constant ReportService::RsExam
from (pry):5:in `<main>'

вы получаете свою неинициализированную постоянную ошибку, потому что она не требуется. Попробуйте это и дайте мне знать, как вы поживаете

person David    schedule 14.08.2013
comment
class Engine < ::Rails::Engine генерируется по умолчанию rails plugin new blorgh --mountable, он получит ту же ошибку, пока я удаляю точки с запятой перед Rails::Engine, это не проблема, потому что после require 'report_service' я могу загрузить ReportService::Engine, проблема в том, что я не могу загрузить модели в движок, как эта ошибка [5] pry(main)> ReportService::RsExam NameError: uninitialized constant ReportService::RsExam - person Richie Min; 15.08.2013
comment
Вы правильно смонтировали это, подключено ли оно к вашим маршрутам? - person David; 15.08.2013
comment
если я использовал gem 'report_service', :git => '[email protected]:report_service.git', :branch => :master, все в порядке, но я добавляю опции ':required =› false', потому что я не хочу, чтобы этот гем загружался при инициализации проекта rails - person Richie Min; 15.08.2013
comment
@RichieMin еще одна вещь, которая пришла мне в голову, что вы делаете :require => false. Я надеюсь, вы знаете, что это делает. Что вы говорите, так это то, что в вашем gemfile вы регистрируете этот gem как зависимость БЕЗ необходимости. Насколько я понимаю, если я прав, причина, по которой вы это сделали, заключалась в том, что вы хотели просто зарегистрировать его, а не загрузить. Так что в любом случае в вашем производственном режиме он вам понадобится. Еще раз добавьте эту требуемую строку, которую я предложил. - person David; 15.08.2013
comment
@RichieMin, если этот ответ помог вам с вашим вопросом, отметьте его как завершенный - person David; 20.08.2013
comment
извини @David, я проверил это поздно, только сейчас я обнаружил, что должен добавить Dir[ReportService::Engine.root + 'app/models/**/*.rb'].collect{ |f| require f } эту строку в lib/report_service.rb, загрузить модели вручную, это решит мой вопрос, я не знаю, есть ли другое решение. - person Richie Min; 20.08.2013