免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3986 | 回复: 2
打印 上一主题 下一主题

一个rails2.3+ruby1.8项目升级到rails3.2+ruby1.9的记录 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-13 16:55 |只看该作者 |倒序浏览
一个rails2.3+ruby1.8项目升级到rails3.2+ruby1.9的记录







经过2个星期的折腾,终于将一个项目从rails2.3+ruby1.8升级到rails3.2+ruby1.9,记录一下过程和踩到的地雷:

升级流程:

1. 在ruby1.8和rails2.3的环境下,在项目下安装rails_upgrade插件: https://github.com/rails/rails_upgrade 运行下列命令,将输出的内容保存供后续使用。

A. rake rails:upgrade:check, 它会查找不兼容的语法和插件

B. rake rails:upgrade:routes, 会把rails2.3格式的route文件转化成rails3格式

C. rake rails:upgrade:gems, 会把写在environment.rb里面的gem管理方式变成bundle管理的Gemfile格式

D. rake rails:upgrade:configuration, 会将原先在environment.rb里面的其他设置转化成rails3格式的config/application.rb文件


2. 用rvm切换到ruby 1.9.3, gem install rails v=3.2
A. 执行rails new old_app_path 会提醒你是否要覆盖一些文件(比如routes.rb等),可以选择全部覆盖(做好备份)

B. 将1.B生成的内容,覆盖到routes.rb

C. 将1.C生成的内容,覆盖到Gemfile

D. 将1.D生成的内容,覆盖到application.rb

E. 执行bundle install,安装必要的gem


3. 根据1.A的结果,升级插件和改必要的语法,如下几个基本上都是可以全局查找替换的:
A. 插件升级,rails2的大部分插件到了3以后基本上就不能用了,比如searchlogic,可用meta_search来替代,比如cache-money,可用record-cache替代

B. 支持block的helper改变,比如form_for等支持block的helper,现在必须多个等号,改成‘<%= form_for’才能输出html

C. RAILS_ROOT, RAILS_ENV等常量写法,被Rails.root, Rails.env等模块方法取代 ( http://quaran.to/blog/2010/02/03/the-rails-module/

D. named_scope 改成了 scope ( https://github.com/rails/rails/c ... a69041a4ddc2e0cc914 )

E. 邮件发送api改变 ( http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3


4. 下面是几个比较折腾和change log里面不太注意的地方:
A. Rails 3默认使用了safebuffers: http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/这样就可以不需要到处加<%= h ... %>,非常安全也非常方便,但是rails 2的项目中很多view和helper都需要改写,一些不需要escape的代码还要特别注意加上html_safe (比如richeditor的输出结果)

B. ActiveRecord callback的语法改变,rails2我们可以在model里面写

Ruby代码
  1. 1.class User   
  2. 2.  def after_save   
  3. 3.    self.xxx   
  4. 4.  end  
  5. 5.end  
  6. class User
  7.   def after_save
  8.     self.xxx
  9.   end
  10. end
复制代码
现在必须改成block方式:

Ruby代码
  1. 1.class User   
  2. 2.  before_save do |user|   
  3. 3.    user.xxx   
  4. 4.  end  
  5. 5.end  
  6. class User
  7.   before_save do |user|
  8.     user.xxx
  9.   end
  10. end
复制代码
C. rails_upgrade插件自动生成的routes.rb大部分能够自动工作,但是还是有发现一些namespace的route,自动生成的会出错,需要手工处理一下,改写一下。

D. class_inheritable_accessor 方法改成了 class_attribute

E. request.request_uri 方法改成了 request.fullpath

F. rails3推荐无侵入式的JS,一些旧的onclick的helper都改写成ujs方式

G. yaml的array格式改变(这个好像是ruby1.9的改变),原先可以写
day_names: [星期一,星期二...]
现在改成了
day_names
  - 星期一
  - 星期二

H. ruby 1.9要求每个含有utf8字符的rb文件,必须在文件第一行有magic comment:  # -*- encoding : utf-8 -*- 我觉的这个很折腾,为什么不是默认unicode呢?


5. 4里面的麻烦还算好,基本上耐心改写,测试都可以搞定,这个项目升级遇到最大的麻烦是ruby 1.9 String encoding + yaml序列化的改变,1.8的String对象是不带encoding属性的,serialize一个属性,如果有中文的话,会当作binary存入数据库。

Ruby代码
  1. 1.class Product   
  2. 2.  serialize :properties, Hash  
  3. 3.end  
  4. class Product
  5.   serialize :properties, Hash
  6. end
复制代码
升级以后,必须用db migration,将数据库里面所有的数据进行force_encoding,然后再保存:

Ruby代码
  1. 1.def up   
  2. 2.  rename_column :products, :properties, :old_properties  
  3. 3.  add_column :products, :properties, :text  
  4. 4.     
  5. 5.  Product.reset_column_information   
  6. 6.  
  7. 7.  Product.find(:all).each{|p|   
  8. 8.    if pro = p.old_properties   
  9. 9.      pro.each {|k, v|   
  10. 10.        pro[k] = v.force_encoding('UTF-8') if v.is_a? String  
  11. 11.      }   
  12. 12.      p.properties = pro   
  13. 13.      p.save!   
  14. 14.    end  
  15. 15.  }   
  16. 16.end  
  17.   def up
  18.     rename_column :products, :properties, :old_properties
  19.     add_column :products, :properties, :text
  20.    
  21.     Product.reset_column_information

  22.     Product.find(:all).each{|p|
  23.       if pro = p.old_properties
  24.         pro.each {|k, v|
  25.           pro[k] = v.force_encoding('UTF-8') if v.is_a? String
  26.         }
  27.         p.properties = pro
  28.         p.save!
  29.       end
  30.     }
  31.   end
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-03-14 17:20 |只看该作者
谢谢分享

论坛徽章:
0
3 [报告]
发表于 2012-03-23 08:06 |只看该作者
这个不错哈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP