本文将介绍让你的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::DeliveryJob和ActionMailer::Parameterized::DeliveryJob,改用ActionMailer::MailDeliveryJob。 -
如果名字是空的,
email_address_with_name方法现在只返回地址。 -
open_timeout和read_timeout的默认值在 SMTP 设置中被配置为 5。 -
参见变更日志中的完整变更列表
7.5 活动记录
-
从
connected_to中删除废弃的databasekwarg 。 -
在
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_rubydb:structure:dumpdb:structure:loaddb:structure:load_if_sqldb:structure:dump:#{name}db:structure:load:#{name}db:test:load_structuredb:test:load_structure:#{name}
-
当块的返回时间早于预期时回滚事务。在这个变化之前,当一个事务块提前返回时,事务会被提交。问题是,在事务块内部触发的超时也使得不完整的事务被提交,所以为了避免这种错误,事务块被回滚。
-
在同一列上的合并条件不再保持两个条件,并将一致地被后一个条件所取代。
-
参见变更日志中的完整变更列表
7.6 活动存储
-
增加了
ActiveStorage::Blob.compose,以串联多个blobs。 -
在Blobs上设置的自定义元数据现在会被持久化到远程存储。
-
支持直接上传至多个服务。
-
支持将偏空的
has_many_attached值转换为[](例如[""])。@user.highlights = [""] @user.highlights # => [] -
无效的默认内容类型被废弃:用content_type
image/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,keys和to_xmlinActiveModel::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_url或blob_url_template到rich_text_area_tag。 -
参见变更日志中的完整变更列表。
7.11 动作邮箱
-
将
attachments添加到入站邮件行为的允许参数列表中。 -
增加配置ActiveStorage服务来存储邮件原始源的功能。
-
增加通过指挥者接口焚烧入站邮件的功能。
-
参见变更日志中的完整变更列表。
8.接下来的步骤
如果你成功地遵循了所有这些步骤,你现在应该已经开始运行Rails 7.0了!你有什么其他有用的提示或建议吗?我们是否错过了什么重要的东西?请在评论区与我们分享。