从Rails 2.3.5 升级到 Rails 3.0 beta

阅读更多
因为有一个新的项目打算使用Rails 3.0 beta,所以先试试从Rails 2.3.5升级到Rails 3.0 beta.

请参考官方的release note http://guides.rails.info/3_0_release_notes.html
JavaEye也有一篇介绍Rails 3的 http://www.iteye.com/topic/591833

首先要安装Rails 3.0 beta,ruby的版本是1.8.7和1.9.x都可以,我用的是Ruby Enterprise Edition 1.8.7
安装Rails之前,最好先升级一下rubygem,现在最新的版本是1.3.6
gem update --system


安装Rails 3.0 beta

比较大的变化就是Rails 3.0要依赖比较多的包,这个是Rails核心代码变得简洁带来的变化.
先安装依赖:
gem install tzinfo builder i18n memcache-client rack rake rack-test erubis mail text-format thor bundler

gem install rack-mount -v=0.4

gem install rails --pre


Rails 3.0可以指字使用的测试框架,这次我打算使用Rspec
gem install rspec --prerelease
gem install rspec-rails --pre


前奏完成,下面开始升级.提示: 升级有风险,请自觉备份.
先安装官方的升级插件
cd myapp
script/plugin install git://github.com/rails/rails_upgrade.git

根据实际的经验,这个插件做的事情比较有限,经过我大半天的摸索,另外新建一个Rails 3的项目,专门用来拷贝一些Rails 3特有的文件,直接而有效.
rails newapp


检查
rake -T rails:upgrade 
#可以看到升级插件提供的几个rake,用来帮助升级.

rake rails:upgrade:check
#下面的输入会提醒那些文件将要修改,那些文件使用了旧的api之类的.

(in /home/yanghuan/dev/myapp)
named_scope is now just scope
The named_scope method has been renamed to just scope.
More information: http://github.com/rails/rails/commit/d60bb0a9e4be2ac0a9de9a69041a4ddc2e0cc914

The culprits: 
	- /home/yanghuan/dev/myapp/app/models/user.rb
	- /home/yanghuan/dev/myapp/app/models/book.rb

Old Rails generator API
A plugin in the app is using the old generator API (a new one may be available at http://github.com/trydionel/rails3-generators).
More information: http://blog.plataformatec.com.br/2010/01/discovering-rails-3-generators/

The culprits: 
	- /home/yanghuan/dev/myapp/vendor/plugins/cells/generators/

Old router API
The router API has totally changed.
More information: http://yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up/

The culprits: 
	- config/routes.rb

Deprecated test_help path
You now must require 'rails/test_help' not just 'test_help'.
More information: http://weblog.rubyonrails.org/2009/9/1/gem-packaging-best-practices

The culprits: 
	- /home/yanghuan/dev/myapp/test/test_helper.rb.rails2
	- /home/yanghuan/dev/myapp/test/test_helper.rb

New file needed: config/application.rb
You need to add a config/application.rb.
More information: http://omgbloglol.com/post/353978923/the-path-to-rails-3-approaching-the-upgrade

The culprits: 
	- config/application.rb

Old gem bundling (config.gems)
The old way of bundling is gone now.  You need a Gemfile for bundler.
More information: http://omgbloglol.com/post/353978923/the-path-to-rails-3-approaching-the-upgrade

The culprits: 
/home/yanghuan/dev/myapp/config/environment.rb


备份
rake rails:upgrade:backup
#这个rake会备份一些要修改的文件,备份文件以rails2结尾.

(in /home/yanghuan/dev/myapp)

* backing up app/controllers/application_controller.rb to app/controllers/application_controller.rb.rails2
* backing up app/helpers/application_helper.rb to app/helpers/application_helper.rb.rails2
* backing up config/routes.rb to config/routes.rb.rails2
* backing up config/environment.rb to config/environment.rb.rails2
......


配置文件
rake rails:upgrade:configuration
#这个rake输出config/application.rb文件的内容,但是不太靠谱,基本上就是把原来environment.rb文件中
Rails::Initializer.run do |config|
	# 这里的代码会被复制到 config/application.rb
     # 如果你在这里有config.gem 的配置,在新的config/application.rb文件中要删除掉,会报错的.
end

#请注意,这个rake只是输入config/application.rb文件的内容,并不会帮你生成这个文件,所以你还要自己手动地新建一个config/applicaton.rb文件,并把刚才的输入复制到进去.

#说这个rake生成的内容不靠谱是因为缺少了以下这一段,现在知道为什么要新建一个Rails 3的项目了吧:) 
require 'rails/all'

# Auto-require default libraries and those for the current Rails environment.
Bundler.require :default, Rails.env

#把这上面这段代码复制到 config/application.rb文件的第2行,第一行是加载boot.rb,不要删除了哦.


Gem文件
rake rails:upgrade:gems
#输出Gemfile文件的内容,但是要你手动去新建一个Gemfile文件,放在项目的要目录下.

#生成的文件大概就是这个样子
(in /home/yanghuan/dev/myapp)
# Edit this Gemfile to bundle your application's dependencies.
# This preamble is the current preamble for Rails 3 apps; edit as needed.
# 下面注释掉的这两行是没用的,输出的内容是没有注释的.
#path "/path/to/rails", :glob => "{*/,}*.gemspec"
#git "git://github.com/rails/rack.git"

gem "rails", "3.0.pre"

source 'http://gemcutter.org'
gem 'will_paginate', '~> 2.3.11'



路由
rake rails:upgrade:routes
#输出新的routes.rb的内容,还是要手动地把这些内容复制到routes.rb中.

#生成的文件大概就是这个样子
#(in /home/yanghuan/dev/myapp)
Myapp::Application.routes.draw do
  match '/' => 'books#index'
  resources :books do
  
  
      resources :briefs
    resources :diaries
  end

  resources :briefs
  resources :diaries
  resources :users do
  
  
      resources :briefs
    resources :diaries
  end

end


还要做的事情

1.缺少了 config.ru文件,请到新项目newapp中复制过来.

2.从新项目newapp中复制environment.rb覆盖旧文件,并修改application的名称
Newapp::Application.initialize! #这里的Newapp就是你的application名了.


3.在initializers文件夹下少了 new_rails_defaults.rb这个文件(这个文件要删除,不然无法启动rails),多了一个 cookie_verification_secret.rb .官方文档的说法是:
引用
The cookie_verifier_secret has been deprecated and now instead it is assigned through Rails.application.config.cookie_secret and moved into its own file:config/initializers/cookie_verification_secret.rb.


4.必须修改 boot.rb 文件(新建一个rails 3的项目,把新生成的复制过去,否则rake会一直报错),同样是要修改application名的,请看第2点.

5.执行 rake rails:update:scripts 用来生成新的rails 命令,更靠谱的做法是把scripts目录删除掉,然后把新项目newapp中整个script复制过来.

6.修改environments目录下的三个文件,这三个文件要这样修改:
Myapp::Application.configure do
    # 原来的代码
end



把上面要做的都做完了, 如果你没有用插件(或者你使用的插件已经支持Rails 3.0 beta了),估计就可以初步地启动服务器了

cd myapp
rails server #(或者更简洁的命令: rails s,不要再用script/server了)


在 Is Your Plugin Ready For Rails 3? 和 Rails Wiki 可以看到那些插件支持了Rails 3,你也可以去rubygems.org或者github.com看看,一般支持Rails 3的gem 都是这样安装的
gem install gemname –pre
# 当然这个是惯例而已,不作得准的 :)

比如最常用的分页插件will_paginate已经支持Rails 3了,可以这样安装
gem install will_paginate –pre

#然后在Gemfile中加上一句: 
gem 'will_paginate' '3.0.pre'


github.com上的分支(比如是支持Rails 3的分支),可以这样安装
script/plugin install git://github.com/mischa/a-repo.git -r branch_name
# -r 这个选项同样是适用于svn的.


总结

从release note就可以看到,Rails 3的改变是很大的,这也是我在新项目中打算直接用Rails 3的原因,这次的升级更加坚定了直接上Rails 3的决心

除了升级比较麻烦之外(貌似Rails的升级每次都是伤筋动骨的),Rails 3中很多的代码的写法都不一样了,有些旧的写法甚至不再支持了,比如 named_scope 变成了 scope .在View中的很多help方法都变了,尤其是跟Javascript有关的,如果数量多的话,要改起来真不是一般的有难度啊.

今天这一折腾倒是对Rails 3结构的变化了解得多了一些.今天的升级只涉及到Rails 3的一些结构上的变化,新版本的代码写法有那些变化,暂时还没有折腾,接下来就会尝试写Rails 3的代码,到时再另外写一篇博客说明吧.

Rails升级总是让我觉得插件实在是不怎么靠谱,很多都跟不上来,可是不用又不行,真是纠结.


你可能感兴趣的:(Rails,Ruby,Grails,企业应用,Rack)