请参考官方的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升级总是让我觉得插件实在是不怎么靠谱,很多都跟不上来,可是不用又不行,真是纠结.