如果config.cache_classes = true,则Rails无法找到该模块 [英] Rails can't find the module, if config.cache_classes = true

查看:133
本文介绍了如果config.cache_classes = true,则Rails无法找到该模块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个通过 routes.rb & 的Gemfile 。以下是重要的内容:

应用程序的 Gemfile

  source'https://rubygems.org'

gem'rails','3.2.9'
gem'mysql2'


组:资产do
gem'sass-rails'
gem'咖啡栏'
结束
gem'jquery-rails'
gemcommon_client ,路径:../common-client

应用程序的 routes.rb

  mount CommonClient :: Engine => ,:as =>> 'shared'

gem's routes.rb

  get'/ register'=> 'session#new_registration'

gems's SessionController

  require'common_client / session_controller_base'

class SessionController< ApplicationController

包括CommonClient :: SessionControllerBase
end

gems's SessionControllerBase

 模块CommonClient 

模块SessionControllerBase

def new_registration
#some code goes here
end
end

这在开发& rails能找到 CommonClient :: SessionController &当访问者点击 / register route时,执行 new_registration 动作。但在Production中,rails无法找到 CommonClient :: SessionController &生成以下错误:

  $ RAILS_ENV =生产轨道s 
=>引导WEBrick
=> Rails 3.2.9应用程序在http://0.0.0.0:3000
=>的生产中开始生产。用-d呼叫以分离
=> Ctrl-C关闭服务器
[2012-12-09 03:27:29]信息WEBrick 1.3.1
[2012-12-09 03:27:29]信息ruby 1.9.3(2012) -10-12)[x86_64-linux]
[2012-12-09 03:27:29] INFO WEBrick :: HTTPServer#start:pid = 4248 port = 3000
启动GET/为127.0.0.1 at 2012-12-09 03:28:17 +0530
由WelcomeController处理#index为HTML
重定向到localhost:3000 / register
过滤器链暂停为:check_credentials呈现或重定向
完成302发现于267ms(ActiveRecord:0.0ms)
在2012-12-09 03:28:18 +0530
$ b $开始GET/ register为127.0.0.1 b ActionController :: RoutingError(未初始化的常量CommonClient :: SessionController):
vendor / bundles / ruby​​ / 1.9.1 / gems / activesupport-3.2.9 / lib / active_support / inflector / methods.rb:230:
vendor / bundles / ruby​​ / 1.9.1 / gems / activesupport-3.2.9 / lib / active_support / inflector / methods.rb:229:在`each'
vendor / bundles /红宝石/ 1.9.1 /宝石/的ActiveSupport-3.2.9 / LIB / active_support /inflector/methods.rb:229:in`constantize'
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / routing / route_set.rb:69:in`controller_reference '
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / routing / route_set.rb:54:`controller'
vendor / bundles / ruby​​ / 1.9 .1 / gems / actionpack-3.2.9 / lib / action_dispatch / routing / route_set.rb:32:在`call'中
vendor / bundles / ruby​​ / 1.9.1 / gems / journey-1.0.4 / lib /journey/router.rb:68:in`block in call'
vendor / bundles / ruby​​ / 1.9.1 / gems / journey-1.0.4 / lib / journey / router.rb:56:in`each '
vendor / bundles / ruby​​ / 1.9.1 / gems / journey-1.0.4 / lib / journey / router.rb:56:`call'
vendor / bundles / ruby​​ / 1.9.1 /gems/actionpack-3.2.9/lib/action_dispatch/routing/route_set.rb:601:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / railties-3.2.9 / lib / rails /engine.rb:479:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / railties-3.2.9 / lib / rails / railtie / configurable.rb:30:在`method_missing'
出售或/ bundles / ruby​​ / 1.9.1 / gems / journey-1.0.4 / lib / journey / router.rb:68:在`block in call'中
vendor / bundles / ruby​​ / 1.9.1 / gems /在每个
vendor / bundles / ruby​​ / 1.9.1 / gems / journey-1.0.4 / lib / journey / router.rb: 56:在`call'中
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / routing / route_set.rb:601:在`call'
vendor / bundle / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / middleware / best_standards_support.rb:17:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / rack- 1.4.1 / lib / rack / etag.rb:23:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / rack-1.4.1 / lib / rack / conditionalget.rb:25:在'call'中
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / middleware / head.rb:14:在`call'
vendor / bundles / ruby / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / middleware / params_parser.rb:21:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2。 9 / LIB / action_dispatch /中间件/ flash.rb:24 2:在'call'中
vendor / bundles / ruby​​ / 1.9.1 / gems / rack-1.4.1 / lib / rack / session / abstract / id.rb:205:在`context'中
vendor / bundles / ruby​​ / 1.9.1 / gems / rack-1.4.1 / lib / rack / session / abstract / id.rb:200:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / middleware / cookies.rb:341:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / activerecord-3.2.9 / lib / active_record / query_cache.rb:64:`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / activerecord-3.2.9 / lib / active_record / connection_adapters / abstract / connection_pool.rb:479:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / middleware / callbacks.rb:28:在`block in call'中
vendor / bundles / ruby​​ / 1.9.1 / gems / activesupport-3.2.9 / lib / active_support / callbacks.rb:405:在_run__4296103602150594596__call__1936882885794917979__callbacks'
vendor / bundles / ruby​​ / 1.9.1 / gems / activesupport-3.2.9 / lib / active_support / callbacks.rb:405:在`__run_callback'
vendor / bundles / ruby​​ / 1 .9.1 / gems / activesupport-3.2.9 / lib / active_support / callbacks.rb:385:在`_run_call_callbacks'
vendor / bundles / ruby​​ / 1.9.1 / gems / activesupport-3.2.9 / lib / active_support /callbacks.rb:81:in`run_callbacks'
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / middleware / callbacks.rb:27:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch / middleware / remote_ip.rb:31:在`call'
vendor / bundles / ruby​​ / 1.9.1 /gems/actionpack-3.2.9/lib/action_dispatch/middleware/debug_exceptions.rb:16:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack-3.2.9 / lib / action_dispatch /middleware/show_exceptions.rb:56:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / railties-3.2.9 / lib / rails / rack / logger.rb:32:在`call_app '
vendor / bundles / ruby​​ / 1.9.1 / gems / railties-3.2.9 / lib / rails / rack / logger.rb:16:在`block in call'中
vendor / bundles / ruby /1.9.1/gems/activesupport-3.2.9/lib/active_support/tagged_logging.rb:22:in`tagged'
vendor /bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/rack/logger.rb:16:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / actionpack -3.2.9 / lib / action_dispatch / middleware / request_id.rb:22:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / rack-1.4.1 / lib / rack / methodoverride.rb :21:`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / rack-1.4.1 / lib / rack / runtime.rb:17:在`call'
vendor / bundles /ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/cache/strategy/local_cache.rb:72:in`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / rack -1.4.1 / lib / rack / lock.rb:15:在`call'中
vendor / bundles / ruby​​ / 1.9.1 / gems / rack-cache-1.2 / lib / rack / cache / context.rb :136:在'forward'中
vendor / bundles / ruby​​ / 1.9.1 / gems / rack-cache-1.2 / lib / rack / cache / context.rb:245:在'fetch'
vendor /bundles/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:185:in`lookup'
vendor / bundles / ruby​​ / 1.9.1 / gems / rack -cache-1.2 / lib / rack / cache / context.rb:66:在`call!'
vendor / bundles / ruby​​ / 1.9.1 / gems / rac k-cache-1.2 / lib / rack / cache / context.rb:51:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / railties-3.2.9 / lib / rails / engine。 rb:479:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / railties-3.2.9 / lib / rails / application.rb:223:在`call'
vendor / bundle / ruby​​ / 1.9.1 / gems / rack-1.4.1 / lib / rack / content_length.rb:14:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / railties-3.2。 9 / lib / rails / rack / log_tailer.rb:17:在`call'
vendor / bundles / ruby​​ / 1.9.1 / gems / rack-1.4.1 / lib / rack / handler / webrick.rb: 59:在`service'
/home/gaurish/.rvm/rubies/ruby-1.9.3-p286-perf/lib/ruby/1.9.1/webrick/httpserver.rb:138:in`service'
/home/gaurish/.rvm/rubies/ruby-1.9.3-p286-perf/lib/ruby/1.9.1/webrick/httpserver.rb:94:in`run'
/ home /gaurish/.rvm/rubies/ruby-1.9.3-p286-perf/lib/ruby/1.9.1/webrick/server.rb:191:in`block in start_thread'


^ C [2012-12-09 03:42:57] INFO要关机...
[2012-12-09 03:42:57] INFO WEBrick :: HTTPServer#开始完成。
退出

现在,
是有趣的部分。这些错误在生产和销售中消失了。当我在 production.rb 中禁用代码缓存时,应用程序工作得很好。通过设置

  config.cache_classes = false 

所有这些让我怀疑,


  1. 为什么rails可以 CommonClient :: SessionController 在开发env中,而不是在生产环境中

  2. 设置 config.cache_classes = false 它在生产中工作?并且rails可以找到 CommonClient :: SessionController ,它以前无法做到这一点

  3. 当rails找到时我需要做的事情 CommonClient :: SessionController 除了禁用代码缓存&重新加载每个请求中的所有代码?

最后,我试图尽可能解释,但仍然不清楚或更多信息是必须的。请留下评论。谢谢

解决方案

尝试更新routes.rb,如:

  require'common_client'
mount CommonClient :: Engine => '/ shared'


I have a gem which is mounted as engine in my rails app via routes.rb & Gemfile. Here are the important pieces:

Apps' Gemfile

source 'https://rubygems.org'

gem 'rails', '3.2.9'
gem 'mysql2'


group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
end
gem 'jquery-rails'
gem "common_client", path: "../common-client"

App's routes.rb

mount CommonClient::Engine => "", :as => 'shared'

gem's routes.rb

get '/register' => 'session#new_registration'

gems's SessionController

require 'common_client/session_controller_base'

class SessionController < ApplicationController

  include CommonClient::SessionControllerBase
end

gems's SessionControllerBase

module CommonClient

  module SessionControllerBase

  def new_registration
      #some code goes here
  end
end

This works just fine in development & rails is able to find CommonClient::SessionController & execute new_registration action whenever visitor hits /register route. But in Production, rails is unable to find CommonClient::SessionController & generates the following error:

$ RAILS_ENV=production rails s
=> Booting WEBrick
=> Rails 3.2.9 application starting in production on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-12-09 03:27:29] INFO  WEBrick 1.3.1
[2012-12-09 03:27:29] INFO  ruby 1.9.3 (2012-10-12) [x86_64-linux]
[2012-12-09 03:27:29] INFO  WEBrick::HTTPServer#start: pid=4248 port=3000
Started GET "/" for 127.0.0.1 at 2012-12-09 03:28:17 +0530
Processing by WelcomeController#index as HTML
Redirected to localhost:3000/register
Filter chain halted as :check_credentials rendered or redirected
Completed 302 Found in 267ms (ActiveRecord: 0.0ms)
Started GET "/register" for 127.0.0.1 at 2012-12-09 03:28:18 +0530

ActionController::RoutingError (uninitialized constant CommonClient::SessionController):
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/inflector/methods.rb:230:in `block in constantize'
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/inflector/methods.rb:229:in `each'
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/inflector/methods.rb:229:in `constantize'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/routing/route_set.rb:69:in `controller_reference'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/routing/route_set.rb:54:in `controller'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/routing/route_set.rb:32:in `call'
  vendor/bundles/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:68:in `block in call'
  vendor/bundles/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:56:in `each'
  vendor/bundles/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:56:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/routing/route_set.rb:601:in `call'
  vendor/bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/engine.rb:479:in `call'
  vendor/bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/railtie/configurable.rb:30:in `method_missing'
  vendor/bundles/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:68:in `block in call'
  vendor/bundles/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:56:in `each'
  vendor/bundles/ruby/1.9.1/gems/journey-1.0.4/lib/journey/router.rb:56:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/routing/route_set.rb:601:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/etag.rb:23:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/conditionalget.rb:25:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/head.rb:14:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/params_parser.rb:21:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/flash.rb:242:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:205:in `context'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:200:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/cookies.rb:341:in `call'
  vendor/bundles/ruby/1.9.1/gems/activerecord-3.2.9/lib/active_record/query_cache.rb:64:in `call'
  vendor/bundles/ruby/1.9.1/gems/activerecord-3.2.9/lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:405:in `_run__4296103602150594596__call__1936882885794917979__callbacks'
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:405:in `__run_callback'
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/callbacks.rb:81:in `run_callbacks'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  vendor/bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/rack/logger.rb:32:in `call_app'
  vendor/bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/rack/logger.rb:16:in `block in call'
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/tagged_logging.rb:22:in `tagged'
  vendor/bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/rack/logger.rb:16:in `call'
  vendor/bundles/ruby/1.9.1/gems/actionpack-3.2.9/lib/action_dispatch/middleware/request_id.rb:22:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/methodoverride.rb:21:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/runtime.rb:17:in `call'
  vendor/bundles/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/lock.rb:15:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:136:in `forward'
  vendor/bundles/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:245:in `fetch'
  vendor/bundles/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:185:in `lookup'
  vendor/bundles/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:66:in `call!'
  vendor/bundles/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:51:in `call'
  vendor/bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/engine.rb:479:in `call'
  vendor/bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/application.rb:223:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/content_length.rb:14:in `call'
  vendor/bundles/ruby/1.9.1/gems/railties-3.2.9/lib/rails/rack/log_tailer.rb:17:in `call'
  vendor/bundles/ruby/1.9.1/gems/rack-1.4.1/lib/rack/handler/webrick.rb:59:in `service'
  /home/gaurish/.rvm/rubies/ruby-1.9.3-p286-perf/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  /home/gaurish/.rvm/rubies/ruby-1.9.3-p286-perf/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  /home/gaurish/.rvm/rubies/ruby-1.9.3-p286-perf/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'


^C[2012-12-09 03:42:57] INFO  going to shutdown ...
[2012-12-09 03:42:57] INFO  WEBrick::HTTPServer#start done.
Exiting

Now, here is the interesting part. These errors goes away in production & app works just fine when I disable code caching in production.rb. by setting

config.cache_classes = false

All this makes me wonder,

  1. why rails can CommonClient::SessionController in development env but not in production env?
  2. How does setting config.cache_classes = false makes it work in production? And rails can find CommonClient::SessionController which it was not able to do earlier
  3. What I need to do when so that rails finds CommonClient::SessionController other than ugly hack of disabling code cache & reloading all code on each request?

Lastly, I have tried to explain as best I could but still something is not clear or more information is required. Please leave a comment. Thanks

解决方案

Try update routes.rb like:

require 'common_client'
mount CommonClient::Engine => '/shared'

这篇关于如果config.cache_classes = true,则Rails无法找到该模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆