从 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