无法在轨道上的可安装引擎中加载模型
Posted
技术标签:
【中文标题】无法在轨道上的可安装引擎中加载模型【英文标题】:cannot load models within mountable engine on rails 【发布时间】:2013-08-13 09:33:47 【问题描述】:我有一个使用 mongo db 的 rails 项目,并且我编写了一个名为“report_service”的可挂载引擎。
我在 main rails 项目中这样使用它:
gem 'report_service', :git => 'git@xx.com:report_service.git', :branch => :master, :require => false
我不想在 Rails 项目初始化时加载这个 gem,所以我添加了 :require => false
选项。
但是在我的 Rails 控制台中,在我执行 require 'report_service'
之后,我在这个 gem 中找不到模型。
[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 gem 目录和代码:
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/app/models/report_service/rs_exam.rb
module ReportService
class RsExam < ActiveRecord::Base
end
end
【问题讨论】:
您是否尝试过在初始化时加载您的 gem?然后尝试? 去掉':required => false'也没关系,但这不是我想要的 【参考方案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
,这就是为什么您会收到未初始化的常量错误的原因。因为查看控制台输出。
加载 gem 工作正常。
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>'
您收到未初始化的常量错误,因为它不是必需的。试试看,让我知道你的进展情况
【讨论】:
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
您是否正确安装了它,它是否已插入您的路线?
如果我使用gem 'report_service', :git => 'git@xx.com:report_service.git', :branch => :master
,一切正常,但我添加了 ':required => false' 选项,因为我不想在 rails 项目初始化时加载这个 gem
@RichieMin 你正在做的另一件事是:require => false
。我希望你知道这是做什么的。您在 gemfile 中所说的是您将该 gem 注册为依赖项没有它是必需的。据我了解,如果我是正确的,您这样做的原因是因为您只想注册它而不是加载它。所以无论如何在你的生产模式下你都需要它。再次添加我建议的 require 行。
@RichieMin 如果这个答案对你的问号有帮助,那就完成以上是关于无法在轨道上的可安装引擎中加载模型的主要内容,如果未能解决你的问题,请参考以下文章