ruby-on-rails - 包括模块在开发中工作,在生产中启动时失败?

标签 ruby-on-rails ruby ruby-on-rails-3

我编写了一个位于我的 lib 文件夹中的模块。我在启动时将其放入我的 environment.rb 文件中,如下所示

# Load the rails application
require File.expand_path('../application', __FILE__)

# Initialize the rails application
MyProject::Application.initialize!

ActiveRecord::Base.send :include, MyProject::Has::Formatter
include MyProject::EventFormatters

这在开发中效果很好,但如果我尝试在生产模式下运行或者将我的应用程序部署到生产中,当服务器尝试启动时,我会得到以下堆栈跟踪:

=> Booting WEBrick
=> Rails 3.0.3 application starting in production on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-3.0.3/lib/active_record/base.rb:1008:in `method_missing': undefined local variable or method `has_formatter' for #<Class:0x808f830> (NameError)
        from C:/Data/myproject/app/models/event.rb:2
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:227:in `load_dependency'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:346:in `require_or_load'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:300:in `depend_on'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:216:in `require_dependency'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:138:in `eager_load!'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:137:in `each'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:137:in `eager_load!'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:135:in `each'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:135:in `eager_load!'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application.rb:108:in `eager_load!'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application/finisher.rb:41
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:25:in `instance_exec'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:25:in `run'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:50:in `run_initializers'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:49:in `each'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:49:in `run_initializers'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application.rb:134:in `initialize!'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application.rb:77:in `send'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application.rb:77:in `method_missing'
        from C:/Data/myproject/config/environment.rb:5
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `load_dependency'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:596:in `new_constants_in'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `load_dependency'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
        from C:/Data/myproject/config.ru:3
        from C:/Ruby187/lib/ruby/gems/1.8/gems/rack-1.2.1/lib/rack/builder.rb:46:in `instance_eval'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/rack-1.2.1/lib/rack/builder.rb:46:in `initialize'
        from C:/Data/myproject/config.ru:1:in `new'
        from C:/Data/myproject/config.ru:1

现在这是整个事情中最令人难以置信的部分:如果我在 config/environments/Production.rb 中设置 config.cache_classes = false 那么我就不会'无法获取堆栈跟踪,并且应用程序在生产模式下的行为与开发模式下的行为相同!!

设置 config.cache_classes = false 使得以这种方式包含在生产环境中的模块怎么样?我是否以错误/奇怪的方式包含该模块?

最佳答案

希望我完全正确,我至少会表达我的观点:

在开发中,所有类都是延迟加载的。这样,您可以轻松更改它们,因为它们仅在必要时加载。这意味着:

MyProject::Application.initialize!

是否加载需要以下内容的模块内容:

ActiveRecord::Base.send :include, MyProject::Has::Formatter
include MyProject::EventFormatters

之后包含它,它使整个事情正常工作。

在生产中,模块和类确实被加载 => 崩溃,它们需要依赖项!

结果,输入:

ActiveRecord::Base.send :include, MyProject::Has::Formatter
include MyProject::EventFormatters

config/initializers 中创建的初始值设定项中,将其命名为 active_record_extension.rb

关于ruby-on-rails - 包括模块在开发中工作,在生产中启动时失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4840335/

相关文章:

ruby-on-rails - 回形针 gem 渲染头像在不同 View 中上传

ruby-on-rails - 最灵活的 Rails 密码安全实现

ruby - 无法安装 therubyracer

ruby-on-rails - Rails form_for 和 collection_select

html - 如何访问带样式的 div 内的跨度?

ruby-on-rails - Mechanize - 检查页面是否已更新的最简单方法?

ruby-on-rails - 如何使Rails在记录消息时添加行号/时间戳?

ruby-on-rails - 如何在 Rails 中的 Redis 和 SideKiq 中顺序处理队列?

ruby-on-rails - 在 ruby​​ on rails 中显示表格时显示字符串类型的新行 (\n)

ruby - 条件语句出现在表达式之前还是之后有关系吗?