亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4039 | 回復(fù): 2
打印 上一主題 下一主題

一個rails2.3+ruby1.8項目升級到rails3.2+ruby1.9的記錄 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-03-13 16:55 |只看該作者 |倒序瀏覽
一個rails2.3+ruby1.8項目升級到rails3.2+ruby1.9的記錄







經(jīng)過2個星期的折騰,終于將一個項目從rails2.3+ruby1.8升級到rails3.2+ruby1.9,記錄一下過程和踩到的地雷:

升級流程:

1. 在ruby1.8和rails2.3的環(huán)境下,在項目下安裝rails_upgrade插件: https://github.com/rails/rails_upgrade 運行下列命令,將輸出的內(nèi)容保存供后續(xù)使用。

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

B. rake rails:upgrade:routes, 會把rails2.3格式的route文件轉(zhuǎn)化成rails3格式

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

D. rake rails:upgrade:configuration, 會將原先在environment.rb里面的其他設(shè)置轉(zhuǎn)化成rails3格式的config/application.rb文件


2. 用rvm切換到ruby 1.9.3, gem install rails v=3.2
A. 執(zhí)行rails new old_app_path 會提醒你是否要覆蓋一些文件(比如routes.rb等),可以選擇全部覆蓋(做好備份)

B. 將1.B生成的內(nèi)容,覆蓋到routes.rb

C. 將1.C生成的內(nèi)容,覆蓋到Gemfile

D. 將1.D生成的內(nèi)容,覆蓋到application.rb

E. 執(zhí)行bundle install,安裝必要的gem


3. 根據(jù)1.A的結(jié)果,升級插件和改必要的語法,如下幾個基本上都是可以全局查找替換的:
A. 插件升級,rails2的大部分插件到了3以后基本上就不能用了,比如searchlogic,可用meta_search來替代,比如cache-money,可用record-cache替代

B. 支持block的helper改變,比如form_for等支持block的helper,現(xiàn)在必須多個等號,改成‘<%= 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. 郵件發(fā)送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的輸出結(jié)果)

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
復(fù)制代碼
現(xiàn)在必須改成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
復(fù)制代碼
C. rails_upgrade插件自動生成的routes.rb大部分能夠自動工作,但是還是有發(fā)現(xiàn)一些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: [星期一,星期二...]
現(xiàn)在改成了
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存入數(shù)據(jù)庫。

Ruby代碼
  1. 1.class Product   
  2. 2.  serialize :properties, Hash  
  3. 3.end  
  4. class Product
  5.   serialize :properties, Hash
  6. end
復(fù)制代碼
升級以后,必須用db migration,將數(shù)據(jù)庫里面所有的數(shù)據(jù)進行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
復(fù)制代碼

論壇徽章:
0
2 [報告]
發(fā)表于 2012-03-14 17:20 |只看該作者
謝謝分享

論壇徽章:
0
3 [報告]
發(fā)表于 2012-03-23 08:06 |只看該作者
這個不錯哈。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP