`

如果你升级完Rails 2.3.2 遇到了问题

阅读更多


最主要的提示是说:

uninitialized constant ApplicationController
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant'
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:80:in `const_missing'
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:92:in `const_missing'
F:/ROR_SPACE/edepot/app/controllers/store_controller.rb:9


而去store_controller.rb去看

class StoreController < ApplicationController

也就是说找不到application.rb的定义,而当前的文件又确实有application.rb的定义。问题在那里呢?

原来是rails升级以后,application.rb默认文件名改了。这或者是“约定高于配置”的另一面,有人改了约定,我们还不太清楚。那么好吧,我把application.rb的文件名改成application_controller.rb。
接着想要运行,或者,还有一些东西要改cnfig/boot.rb里,那个典型的require_gem问题。

    else
      gem "rails"
      #require_gem "rails"
      require 'initializer'


然后,运行时有点升级

F:\ROR_SPACE\depot_l>rake db:migrate
(in F:/ROR_SPACE/depot_l)
rake aborted!
undefined method `require_gem' for main:Object
F:/ROR_SPACE/depot_l/rakefile:4
(See full trace by running task with --trace)

F:\ROR_SPACE\depot_l>rake db:migrate
(in F:/ROR_SPACE/depot_l)
Your config/boot.rb is outdated: Run "rake rails:update".

F:\ROR_SPACE\depot_l>rake rails:update
(in F:/ROR_SPACE/depot_l)
install -c -m 0755 c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/tasks/../../bin/dbconsole script/dbconsole
F:/ROR_SPACE/depot_l/app/controllers/application.rb has been renamed to F:/ROR_SPACE/depot_l/app/controllers/application_controller.rb, update your SCM as necessary

这段说明也表明,文件名改了。

uninitialized constant FileColumn::ClassMethods::Inflector


如果你还有classic_paginate

那么,请记着也要改这个

options[:singular_name] ||= ActiveSupport::Inflector.singularize(collection_id.to_s)   
options[:class_name]  ||= ActiveSupport::Inflector.camelize(options[:singular_name])   
#      options[:singular_name] ||= Inflector.singularize(collection_id.to_s)   
#      options[:class_name]  ||= Inflector.camelize(options[:singular_name])  
  • 大小: 34.5 KB
分享到:
评论
11 楼 utensil 2009-04-15  
robbin 写道
每次升级Rails都有点心惊肉跳的,不单纯是这些不兼容的文件修改,而是很多不实际上线运行发现不了的新问题。


Robbin何不依据自己对Rails的修改,在Github上做一个兼容性和稳定性更好的fork?这样不仅方便大家,而且可以方便地pull回Rails。
10 楼 richyzhang 2009-03-25  
rainux 写道
yangzhihuan 写道
rainux 写道
yangzhihuan 写道
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.


没有必要创建一个新工程吧,直接在 config/environment.rb 里把 Rails 版本号改成 2.3.2 之后执行 rake rails:update 即可更新所有的文件,包括 application.rb 自动改名。


我一开始就是这样干的,但是执行rake的时候会提示 boot.rb 有错的.


我从 Rails 2.2.2 升级上来的,没有问题。可能是因为你原来的 Rails 版本比较老。


用自动升级应该跟mysql类似,就是一个版本一个版本的upgrade,这样的话麻烦会少很多.
9 楼 rainux 2009-03-25  
yangzhihuan 写道
rainux 写道
yangzhihuan 写道
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.


没有必要创建一个新工程吧,直接在 config/environment.rb 里把 Rails 版本号改成 2.3.2 之后执行 rake rails:update 即可更新所有的文件,包括 application.rb 自动改名。


我一开始就是这样干的,但是执行rake的时候会提示 boot.rb 有错的.


我从 Rails 2.2.2 升级上来的,没有问题。可能是因为你原来的 Rails 版本比较老。
8 楼 yangzhihuan 2009-03-25  
rainux 写道
yangzhihuan 写道
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.


没有必要创建一个新工程吧,直接在 config/environment.rb 里把 Rails 版本号改成 2.3.2 之后执行 rake rails:update 即可更新所有的文件,包括 application.rb 自动改名。


我一开始就是这样干的,但是执行rake的时候会提示 boot.rb 有错的.
7 楼 yehs220 2009-03-24  
QuakeWang 写道

另外还有一些小改动,比如将原先自己写的对rails动态内容输出做gzip压缩,现在可以迁移到rack,用现成的:
config.middleware.use Rack::Deflater


怎么样跳过Deflator?比如动态生成的图片什么的。
6 楼 rainux 2009-03-24  
yangzhihuan 写道
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.


没有必要创建一个新工程吧,直接在 config/environment.rb 里把 Rails 版本号改成 2.3.2 之后执行 rake rails:update 即可更新所有的文件,包括 application.rb 自动改名。
5 楼 lgn21st 2009-03-22  
我手上的项目也刚刚从2.2.2升级到2.3.2,发现几个稍微复杂一点的关联模型上定义的named_scope执行时报SQL语法错误,花了点时间没有看出问题到底在那里,只能放到明天继续排查原因...
可能是原来在2.2.2上通过但是这么用不对
或者是2.3.2有bug,希望是前者...
4 楼 yangzhihuan 2009-03-22  
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.
3 楼 wosmvp 2009-03-21  
JavaEye果然够激进 
2 楼 QuakeWang 2009-03-21  
在迁移JavaEye代码到2.3,已经遇到3个问题了:
1. Cache Sweeper不能正常的auto load,这个ticket号称已经解决,但是还有很多人报告有问题:
http://rails.lighthouseapp.com/projects/8994/tickets/1977-actioncontrollercachingsweeper-autoloading-is-broken
解决方案是检查一下你的environment文件中是否有调用ActionContoller或者ActionRecord的代码,导致先它在sweeper之前加载了,JavaEye在Rails 2.2.2的代码有类似如下设置:
ActionController::Base.session_options[:session_domain] = DEFAULT_ROOT_DOMAIN
ActionController::Base.asset_host = "http://#{DEFAULT_SITE_DOMAIN}"

改成通过config设置就正常了:
config.action_controller.session[:domain] = DEFAULT_ROOT_DOMAIN
config.action_controller.asset_host = "http://#{DEFAULT_SITE_DOMAIN}"


2. 新加的Strategy::LocalCache是memory cache的subclass,里面有freeze的代码:@data[name] = value.freeze,导致memcache store的对象全部被freeze
零时解决方案是hack localcache

3. Collection destroy不接受id作为参数了:
http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2306-associationcollections-destroy-method-is-not-compatible-with-old-version
解决方案是先查询,再调用删除方法。

另外还有一些小改动,比如将原先自己写的对rails动态内容输出做gzip压缩,现在可以迁移到rack,用现成的:
config.middleware.use Rack::Deflater


不过2.3感觉在开发环境中比2.2要快很多,和改进的lazy load有关,在生产环境还须再测试对比看看。
1 楼 robbin 2009-03-21  
每次升级Rails都有点心惊肉跳的,不单纯是这些不兼容的文件修改,而是很多不实际上线运行发现不了的新问题。

相关推荐

Global site tag (gtag.js) - Google Analytics