将Rails从6.1升级到7.0的操作步骤

610 阅读6分钟

本文将介绍让你的Ruby on Rails应用程序从6.1版本升级7.0版本所需了解的最重要的方面。

1.准备工作

在开始升级过程之前,我们有一些建议的准备工作。

  • 你的Rails应用在转移到下一个主要/次要版本之前应该有最新的补丁版本
  • 你应该有至少80%的测试覆盖率,除非你有一个专门的QA团队。
  • 遵循Git流程的工作流程,积极管理至少两个环境:暂存和生产。
  • 通过使用RailsBump检查你的Gemfile.lock是否有不兼容之处。
  • 创建一个双启动机制,最快的方法是安装方便的 gemnext_rails。了解更多关于如何以及为什么要双启动的信息。
  • 要了解更多关于用非向后兼容的变化进行双启动的信息,你可以访问这篇文章

要了解完整的细节,请查看我们的文章:如何为Rails升级准备你的应用程序

2.红宝石版本

Rails 7.0 需要Ruby 2.7或更高版本。请查看此表,了解所有Rails版本中所要求的Ruby版本。

3.宝石

确保你检查你在项目中使用的宝石的GitHub页面,以了解它与Rails 7.0的兼容性。如果你是宝石的维护者,你需要确保它支持Rails 7.0,如果它不支持,请更新它。RailsBump是一个检查宝石兼容性的好工具。

4.配置文件

Rails包括rails app:update 任务。你可以把这个任务作为一个指导原则,在这篇文章中做了详细解释。

作为替代方法,可以查看RailsDiff,它提供了一个基本的Rails应用在6.1.x和7.0.x(或任何其他源/目标版本)之间的变化概况。

5.Rails指南

查阅官方的Rails指南,并遵循你的应用程序所需的任何步骤,这一点很重要。

6.值得注意的变化

  • Zeitwerk:如果你的应用程序仍然在经典模式下运行,你需要切换到zeitwerk模式。也没有设置自动加载模式的配置点,config.autoloader= 已经被删除。如果你把它设置为:zeitwerk ,只要把它删除即可。查看我们写的关于Zeitwerk升级的文章

  • Spring。如果你的应用程序使用Spring,它需要升级到至少3.0.0版本,否则你会得到undefined method 'mechanism=' for ActiveSupport::Dependencies:Module

  • Sprockets现在是一个可选的依赖项。Rails不再依赖sprockets-rails了。如果你的应用程序仍然需要使用Sprockets,你需要明确地添加该依赖关系。如果你想把你的javaScript代码从sprockets迁移到Webpacker,可以看看这个博文

7.应用程序代码

如果你忽略了过去版本跳转时的弃用警告,并且没有及时更新,你可能会发现你的测试有问题,或者应用程序的部分有问题。如果你很难弄清楚为什么有些东西坏了,那可能是因为一个弃用被删除了,所以你可以通过这个列表来检查是否可能是这种情况。

7.1 栏杆
  • dbconsole ,删除已废弃的config
7.2 动作包
  • ActionDispatch::Response 中删除已废弃的return_only_media_type_on_content_type
  • Rails.config.action_dispatch 中删除已废弃的hosts_response_app
  • ActionDispatch::SystemTestCase 中删除废弃的#host!
  • 移除已废弃的支持将path 传递给fixture_file_upload 相对于fixture_path
  • 请参阅更新日志中的完整变化列表。
7.3 动作视图
  • 移除Rails.config.action_view 中废弃的 raise_on_missing_translations

  • ActionView::Helpers::UrlHelper#button_to 改变了该行为。从Rails 7.0开始,如果一个持久化的Active Record对象被用来构建按钮URL,该方法会渲染一个带有补丁的HTTP动词的表单标签。

7.4 Action Mailer
  • 删除已废弃的ActionMailer::DeliveryJobActionMailer::Parameterized::DeliveryJob ,改用ActionMailer::MailDeliveryJob

  • 如果名字是空的,email_address_with_name 方法现在只返回地址。

  • open_timeoutread_timeout 的默认值在 SMTP 设置中被配置为 5。

  • 参见变更日志中的完整变更列表

7.5 活动记录
  • connected_to 中删除废弃的database kwarg 。

  • ActiveRecord::Base 中删除已废弃的allow_unsafe_raw_sql

  • 移除configs_for 中已废弃的选项:spec_name

  • 删除Rails 4.2和4.1格式中对YAML加载ActiveRecord::Base 实例的废弃支持。

  • 移除PostgreSQL数据库中使用:interval 列时的废弃警告。现在,区间列将返回ActiveSupport::Duration 对象而不是字符串。

  • 删除废弃的rake任务。

    • db:schema:load_if_ruby
    • db:structure:dump
    • db:structure:load
    • db:structure:load_if_sql
    • db:structure:dump:#{name}
    • db:structure:load:#{name}
    • db:test:load_structure
    • db:test:load_structure:#{name}
  • 当块的返回时间早于预期时回滚事务。在这个变化之前,当一个事务块提前返回时,事务会被提交。问题是,在事务块内部触发的超时也使得不完整的事务被提交,所以为了避免这种错误,事务块被回滚。

  • 在同一列上的合并条件不再保持两个条件,并将一致地被后一个条件所取代。

  • 参见变更日志中的完整变更列表

7.6 活动存储
  • 增加了ActiveStorage::Blob.compose ,以串联多个blobs。

  • 在Blobs上设置的自定义元数据现在会被持久化到远程存储。

  • 支持直接上传至多个服务。

  • 支持将偏空的has_many_attached 值转换为[](例如[""])。

    @user.highlights = [""]
    @user.highlights # => []
    
  • 无效的默认内容类型被废弃:用content_typeimage/jpg,image/pjpeg,image/bmp,text/javascript 创建的blobs现在将产生一个废弃警告,因为这些不是有效的内容类型。

  • config.active_storage 中删除废弃的replace_on_assign_to_many

  • 移除废弃的build_after_upload ,改用create_after_upload!

  • 移除废弃的service_url ,改用url

  • 参见变更日志中的完整变更列表。

7.7 活动模型
  • 移除废弃的对ActiveModel::Errors 实例的枚举,作为 Hash。

  • 移除废弃的to_h,slice!,values,keysto_xml inActiveModel::Errors

  • 移除已废弃的支持将错误串联到ActiveModel::Errors#messages

  • 移除对清除ActiveModel::Errors#messages 中错误的支持。

  • 移除对从ActiveModel::Errors#messages 中删除错误的支持。

  • 移除对在ActiveModel::Errors#messages 中使用 []= 的废弃支持。

7.8 活动支持
  • 移除config.active_support 中废弃的use_sha1_digests

  • 移除废弃的URI.parser

  • Range 中删除废弃的include?

  • ActiveSupport::Multibyte::Unicode 中删除废弃的default_normalization_form

  • 移除对从ActiveModel::Errors#messages 中删除错误的支持。

  • 移除在ActiveModel::Errors#messages 中使用 []= 的废弃支持。

  • 参见变更日志中的完整变更列表。

7.9 活动任务

删除了当前一个回调被 throw :abort 终止时不停止 after_enqueue/after_perform 回调的废弃行为。

  • 删除废弃的:return_false_on_aborted_enqueue 选项。

  • 移除废弃的ActiveRecord::Base.connection_config

  • 移除已废弃的ActiveRecord::Base.arel_attribute

  • 移除废弃的ActiveRecord::Base.configurations.default_hash

  • 移除已废弃的ActiveRecord::Base.configurations.to_h

  • 移除废弃的ActiveRecord::Result#map! and ActiveRecord::Result#collect!

  • 移除失效的ActiveRecord::Base#remove_connection

  • 参见变更日志中的完整变更列表。

7.10 动作文本
  • 让Action Text + Trix的JavaScript和CSS在资产管道中可用。

  • OpenSSL常量现在被用于Digest计算。

  • 允许传入自定义的direct_upload_urlblob_url_templaterich_text_area_tag

  • 参见变更日志中的完整变更列表。

7.11 动作邮箱
  • attachments 添加到入站邮件行为的允许参数列表中。

  • 增加配置ActiveStorage服务来存储邮件原始源的功能。

  • 增加通过指挥者接口焚烧入站邮件的功能。

  • 参见变更日志中的完整变更列表。

8.接下来的步骤

如果你成功地遵循了所有这些步骤,你现在应该已经开始运行Rails 7.0了!你有什么其他有用的提示或建议吗?我们是否错过了什么重要的东西?请在评论区与我们分享。