【问题标题】:Rails app crashes when config.eager_load=true当 config.eager_load=true 时 Rails 应用程序崩溃
【发布时间】:2014-04-08 16:47:10
【问题描述】:

我有一个 Rails 应用程序和一个引擎。

当我的环境/production.rb 中有 config.eager_load=true 时,应用程序崩溃,引擎中出现以下错误

FATAL: ActionView::Template::Error(undefined local variable or method `current_user' for #<#<Class:0x00000005812fe0>:0x00000005811e88>)
 /var/www/rack_apps/manager/shared/vendor_bundle/ruby/2.1.0/gems/authorization_engine-0.1.0.SNAPSHOT.20140407182910/app/views/authorization_engine/authorizations/new.html.haml:26:in `__var_www_rack_apps_manager_shared_vendor_bundle_ruby_______gems_authorization_engine_______________________________app_views_authorization_engine_authorizations_new_html_haml__268041456534634533_46121540'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/template.rb:143:in `block in render'
 vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.4/lib/active_support/notifications.rb:161:in `instrument'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/template.rb:141:in `render'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/template_renderer.rb:49:in `block (2 levels) in render_template'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
 vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.4/lib/active_support/notifications.rb:159:in `block in instrument'
 vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.4/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
 vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.4/lib/active_support/notifications.rb:159:in `instrument'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/template_renderer.rb:48:in `block in render_template'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/template_renderer.rb:56:in `render_with_layout'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/template_renderer.rb:47:in `render_template'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/template_renderer.rb:17:in `render'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/renderer.rb:42:in `render_template'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_view/renderer/renderer.rb:23:in `render'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/abstract_controller/rendering.rb:127:in `_render_template'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_controller/metal/streaming.rb:219:in `_render_template'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/abstract_controller/rendering.rb:120:in `render_to_body'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_controller/metal/rendering.rb:33:in `render_to_body'
 vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_controller/metal/renderers.rb:26:in `render_to_body'

但如果我设置 config.eager_load = false,上面的方法似乎也有效

这正常吗? ...我知道您不应该在生产中将 eager_load 设置为 false。有没有办法不急于加载引擎或者我把整个概念弄错了?

我知道它说的是未定义的变量 current_user,但是当我在本地运行时它会完美地拾取它。任何建议或想法都会很棒。谢谢

【问题讨论】:

  • 您是否尝试将 :require =&gt; false 放入主应用程序的 Gemfile 中的引擎。通过这样做,您的 gem 将仅在需要时而不是在启动时加载。
  • 这样做会在主应用程序的初始化程序中产生问题(未初始化的常量 {engine name})
  • 您希望在哪里定义current_user?即当您在本地运行时(使用eager_load = false)在哪里定义current_user
  • 既然你们都认真对待这个问题(添加赏金等),请考虑创建一个重现错误的最小环境并与我们分享,以便我们可以在发布之前尝试解决方案。跨度>
  • 没有源代码很难说你的引擎出了什么问题。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

http://edgeguides.rubyonrails.org/configuring.html

官方文档说: config.eager_load 为真时,急切加载所有注册的 config.eager_load_namespaces。这包括您的应用程序、引擎、Rails 框架和任何其他已注册的命名空间。

要正确回答这个问题,我们需要知道您在会话中使用什么,例如 devise gem 之类的。但我猜你使用了一些 gem,如果你说你的应用程序在本地运行没有错误,那么本地和服务器上的 gem 版本可能存在差异?您可以更新 gem,例如它破坏了某些东西。所以我建议你从这个开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多