從 Rails 4.2 升級到 Rails 5.0

注意:在升級 Rails 應用程式之前,請務必將程式碼儲存在版本控制系統上,例如 Git。

要從 Rails 4.2 升級到 Rails 5.0,你必須使用 Ruby 2.2.2 或更高版本。根據需要升級 Ruby 版本後,轉到 Gemfile 並更改行:

gem 'rails', '4.2.X'

至:

gem 'rails', '~> 5.0.0'

並在命令列上執行:

$ bundle update

現在使用以下命令執行更新任務:

$ rake rails:update

這將幫助你更新配置檔案。系統將提示你覆蓋檔案,並且你有幾個輸入選項:

  • 是的 - 是的,覆蓋
  • n - 不,不要覆蓋
  • a - 全部,覆蓋這個和所有其他人
  • q - 退出,中止
  • d - diff,顯示舊舊之間的差異
  • h - 幫助

通常,你應該檢查舊檔案和新檔案之間的差異,以確保你沒有收到任何不必要的更改。

Rails 5.0 ActiveRecord 模型繼承自 ApplicationRecord,而不是 ActiveRecord::BaseApplicationRecord 是所有模型的超類,類似於 ApplicationController 是控制器的超類。要考慮處理模型的這種新方法,你必須在名為 application_record.rbapp/models/資料夾中建立一個檔案,然後將該檔案的內容編輯為:

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

Rails 5.0 還處理稍有不同的回撥。返回 false 的回撥不會停止回撥鏈,這意味著後續的回撥仍然會執行,這與 Rails 4.2 不同。升級時,Rails 4.2 行為將保留,但你可以通過新增以下內容切換到 Rails 5.0 行為:

ActiveSupport.halt_callback_chains_on_return_false = false

config/application.rb 檔案。你可以通過呼叫 throw(:abort) 顯式停止回撥鏈。

在 Rails 5.0 中,ActiveJob 將繼承 ApplicationJob,而不是像 Rails 4.2 中的 ActiveJob::Base。要升級到 Rails 5.0,請在 app/jobs/資料夾中建立名為 application_job.rb 的檔案。將該檔案的內容編輯為:

class ApplicationJob < ActiveJob::Base
end

然後,你必須將所有作業更改為從 ApplicationJob 而不是 ActiveJob::Base 繼承。

Rails 5.0 的其他最大變化之一不需要任何程式碼更改,但會改變你使用 Rails 應用程式的命令列的方式。你將能夠使用 bin/rails,或僅使用 rails 來執行任務和測試。例如,你現在可以使用 $ rake db:migrate 而不是使用 $ rake db:migrate。如果執行 $ bin/rails,則可以檢視所有可用命令。請注意,現在可以使用 bin/rails 執行的許多工仍然可以使用 rake