更多内容请访问 rubyonrails.org:

Ruby on Rails 7.2 版本说明

Rails 7.2 中的亮点

  • 应用程序的开发容器配置。
  • 默认情况下添加浏览器版本保护。
  • 将 Ruby 3.1 设置为新的最低版本。
  • 默认渐进式 Web 应用程序 (PWA) 文件。
  • 默认情况下添加 omakase RuboCop 规则。
  • 默认情况下为新应用程序添加 GitHub CI 工作流。
  • 默认情况下为新应用程序添加 Brakeman。
  • 为 Puma 线程数设置新的默认值。
  • 防止在事务中安排作业。
  • 每个事务的提交和回滚回调。
  • 如果运行 Ruby 3.3+,默认情况下启用 YJIT。
  • Rails 指南的新设计。
  • 在默认的 Dockerfile 中设置 jemalloc 以优化内存分配。
  • 在 bin/setup 中建议使用 puma-dev 配置。

这些版本说明仅涵盖主要更改。要了解各种错误修复和更改,请参阅变更日志或查看 GitHub 上 Rails 主存储库的 提交列表

1 升级到 Rails 7.2

如果您要升级现有应用程序,建议在升级之前拥有良好的测试覆盖率。您还应该先升级到 Rails 7.1(如果您还没有升级),并确保您的应用程序仍然按预期运行,然后再尝试升级到 Rails 7.2。有关升级时需要注意的事项,请参阅 升级 Ruby on Rails 指南。

2 主要功能

2.1 应用程序的开发容器配置

一个 开发容器(或简称 dev 容器)允许您使用容器作为功能齐全的开发环境。

Rails 7.2 添加了为您的应用程序生成开发容器配置的功能。此配置包括一个 .devcontainer 文件夹,其中包含一个 Dockerfile、一个 docker-compose.yml 文件和一个 devcontainer.json 文件。

默认情况下,dev 容器包含以下内容

  • 一个用于 Kredis、Action Cable 等的 Redis 容器。
  • 一个数据库(SQLite、Postgres、MySQL 或 MariaDB)
  • 一个用于系统测试的无头 Chrome 容器
  • Active Storage 配置为使用本地磁盘,并具有可用的预览功能

要使用开发容器生成一个新的应用程序,您可以运行

$ rails new myapp --devcontainer

对于现有应用程序,现在可以使用 devcontainer 命令

$ rails devcontainer

有关更多信息,请参阅 使用 Dev 容器入门 指南。

2.2 默认情况下添加浏览器版本保护

Rails 现在添加了指定允许访问所有操作(或受 only:except: 限制的某些操作)的浏览器版本的功能。

如果传递给 versions: 的哈希或命名集合中匹配的浏览器版本低于指定版本,则会阻止这些浏览器。

这意味着所有其他未知浏览器以及未报告用户代理头的代理将被允许访问。

默认情况下,被阻止的浏览器将被提供 public/406-unsupported-browser.html 中的文件,并使用 HTTP 状态代码“406 Not Acceptable”。

示例

class ApplicationController < ActionController::Base
  # Allow only browsers natively supporting webp images, web push, badges, import maps, CSS nesting + :has
  allow_browser versions: :modern
end

class ApplicationController < ActionController::Base
  # All versions of Chrome and Opera will be allowed, but no versions of "internet explorer" (ie). Safari needs to be 16.4+ and Firefox 121+.
  allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
end

class MessagesController < ApplicationController
  # In addition to the browsers blocked by ApplicationController, also block Opera below 104 and Chrome below 119 for the show action.
  allow_browser versions: { opera: 104, chrome: 119 }, only: :show
end

新生成的应用程序在 ApplicationController 中设置了此保护。

有关更多信息,请参阅 allow_browser 文档。

2.3 将 Ruby 3.1 设置为新的最低版本

到目前为止,Rails 仅在新的主要版本上取消对旧版 Ruby 的兼容性。我们正在改变这项政策,因为这导致我们必须保持与长期不受支持的 Ruby 版本的兼容性,或者更频繁地更新 Rails 主要版本,并在更新主要版本时一次性取消对多个 Ruby 版本的支持。

现在,我们将取消对在 Rails 版本发布时已到期版本的支持。

对于 Rails 7.2,Ruby 3.1 是新的最低版本。

2.4 默认渐进式 Web 应用程序 (PWA) 文件

为了更好地支持使用 Rails 创建 PWA 应用程序,我们现在为清单和服务工作者生成默认的 PWA 文件,这些文件从 app/views/pwa 提供服务,并且可以通过 ERB 动态渲染。这些文件在生成的路由文件中被显式地挂载在根目录,并具有默认路由。

有关更多信息,请参阅 添加此功能的拉取请求

2.5 默认情况下添加 omakase RuboCop 规则

Rails 应用程序现在默认情况下使用 RuboCop 配置,其中包含来自 rubocop-rails-omakase 的一组规则。

Ruby 是一种非常具有表现力的语言,不仅容忍许多不同的方言,而且赞赏它们的差异。它从未被设计为一种仅在所有库、框架或应用程序中使用单一风格编写的语言。如果您或您的团队已经开发出一种让您感到愉悦的特定风格,那么您应该珍惜它。

这组 RuboCop 风格适用于那些还没有决定使用任何特定方言的人。他们只是想要一个合理的基础,并且会从一些默认规则中获益,至少可以从一致的方法开始 Ruby 样式。

这些特定的规则并没有对错之分,只是代表了 Rails 创建者的个人审美观念。您可以全部使用它们,也可以将它们作为起点,或者将其作为灵感,或者根据您的需要进行使用。

2.6 默认情况下为新应用程序添加 GitHub CI 工作流

Rails 现在为新应用程序添加了一个默认的 GitHub CI 工作流文件。这将使新手在使用自动化扫描、代码风格检查和测试方面取得良好的开端。我们发现,这是从一开始就进行单元测试的现代化延续。

当然,GitHub Actions 是一种商业云产品,在您使用完免费令牌后,需要为私有存储库付费。但是,鉴于 GitHub 和 Rails 之间的关系,该平台对于新手的压倒性默认性质,以及教会新手良好 CI 习惯的价值,我们认为这是一个可以接受的权衡。

2.7 默认情况下为新应用程序添加 Brakeman

Brakeman 是一个很好的方法,可以防止 Rails 中常见的安全漏洞进入生产环境。

新应用程序随 Brakeman 一起安装,并与 GitHub CI 工作流相结合,它将在每次推送时自动运行。

2.8 为 Puma 线程数设置新的默认值

Rails 将 Puma 中的默认线程数从 5 改为 3。

由于经过良好优化的 Rails 应用程序的特性,快速 SQL 查询和通过作业运行的缓慢第三方调用,当线程数量过高时,Ruby 会花费大量时间等待全局虚拟机锁 (GVL) 释放,从而影响延迟(请求响应时间)。

经过仔细考虑、调查以及基于生产环境中运行的应用程序的实战经验,我们认为将默认线程数设置为 3 是并发和性能之间的一个良好平衡。

您可以在 此处查看关于此更改的详细讨论。

2.9 阻止在事务中安排作业

Active Job 的一个常见错误是在事务内部排队作业,这会导致它们可能在事务提交之前被另一个进程选取并运行,从而导致各种错误。

Topic.transaction do
  topic = Topic.create

  NewTopicNotificationJob.perform_later(topic)
end

现在 Active Job 会自动将排队推迟到事务提交之后,如果事务回滚,则会丢弃该作业。

各种队列实现可以选择禁用此行为,用户也可以禁用此行为,或者强制在每个作业的基础上启用此行为。

class NewTopicNotificationJob < ApplicationJob
  self.enqueue_after_transaction_commit = :never
end

2.10 每个事务提交和回滚回调

这现在可以通过一个新功能实现,该功能允许在记录之外注册事务回调。

ActiveRecord::Base.transaction 现在会产生一个 ActiveRecord::Transaction 对象,允许在该对象上注册回调。

Article.transaction do |transaction|
  article.update(published: true)

  transaction.after_commit do
    PublishNotificationMailer.with(article: article).deliver_later
  end
end

ActiveRecord::Base.current_transaction 也已添加,允许在该对象上注册回调。

Article.current_transaction.after_commit do
  PublishNotificationMailer.with(article: article).deliver_later
end

最后,ActiveRecord.after_all_transactions_commit 已添加,用于可能在事务内部或外部运行并需要在状态更改正确持久化后执行工作的代码。

def publish_article(article)
  article.update(published: true)

  ActiveRecord.after_all_transactions_commit do
    PublishNotificationMailer.with(article: article).deliver_later
  end
end

有关更多信息,请参阅 #51474#51426

2.11 如果运行 Ruby 3.3+,则默认启用 YJIT

YJIT 是 Ruby 的 JIT 编译器,自 Ruby 3.1 起在 CRuby 中可用。它可以为 Rails 应用程序提供显著的性能提升,延迟提升 15-25%。

在 Rails 7.2 中,如果运行 Ruby 3.3 或更高版本,则默认启用 YJIT。

您可以通过设置以下内容来禁用 YJIT:

Rails.application.config.yjit = false

2.12 Rails 指南的新设计

当 Rails 7.0 在 2021 年 12 月发布时,它附带了一个全新的主页和一个新的启动画面。然而,指南的设计自 2009 年以来基本上没有改变 - 这点并没有被忽视(我们听到了您的反馈)。

现在所有的工作都集中在从 Rails 框架中消除复杂性,并使文档保持一致、清晰和最新,现在是时候解决指南的设计,并使其同样现代、简洁和焕然一新。

我们与 UX 设计师 John Athayde 合作,将主页的外观和感觉迁移到 Rails 指南,使其简洁、美观和最新。

布局将保持不变,但从今天开始,您将在指南中看到以下更改:

  • 更简洁、更少干扰的设计。
  • 与主页更一致的字体、配色方案和徽标。
  • 更新的图标。
  • 简化的导航。
  • 滚动时粘性“章节”导航栏。

查看 公告博客文章以查看一些前后对比图像

2.13 在默认 Dockerfile 中设置 jemalloc 以优化内存分配

Ruby 使用 malloc 会导致内存碎片问题,尤其是在使用多个线程(如 Puma)时。切换到使用不同模式以避免碎片的分配器可以显着减少内存使用量。

Rails 7.2 现在在默认 Dockerfile 中包含 jemalloc 以优化内存分配。

2.14 在 bin/setup 中建议 puma-dev 配置

Puma-dev 是在本地开发多个 Rails 应用程序的最佳方案,如果您不使用 Docker。

Rails 现在建议如何在 bin/setup 中的全新注释中获得该设置。

3 Railties

有关详细更改,请参阅 变更日志

3.1 删除

  • 删除已弃用的 Rails::Generators::Testing::Behaviour

  • 删除已弃用的 Rails.application.secrets

  • 删除已弃用的 Rails.config.enable_dependency_loading

  • 删除已弃用的 find_cmd_and_exec 控制台助手。

  • newdb:system:change rails 命令中删除对 oraclesqlserver 和 JRuby 特定数据库适配器的支持。

  • 从生成器中删除 config.public_file_server.enabled 选项。

3.2 弃用

3.3 值得注意的更改

  • 在新的应用程序和插件中默认添加 RuboCop,其中包含来自 rubocop-rails-omakase 的规则。

  • 在新的应用程序中默认添加 Brakeman,并进行安全检查配置。

  • 默认情况下,为新的应用程序和插件添加 GitHub CI 文件,用于 Dependabot、Brakeman、RuboCop 和运行测试。

  • 现在,对于在 Ruby 3.3+ 上运行的新应用程序,默认情况下启用 YJIT。

  • 生成一个 .devcontainer 文件夹,用于在带有 Visual Studio Code 的容器中运行应用程序。

    $ rails new myapp --devcontainer
    
  • 引入 Rails::Generators::Testing::Assertions#assert_initializer 来测试初始值设定项。

  • 系统测试现在默认情况下对新的应用程序使用无头 Chrome。

  • 支持 BACKTRACE 环境变量以在正常的服务器运行中关闭回溯清理。以前,这仅适用于测试。

  • 为 manifest 和 service worker 添加默认的渐进式 Web 应用程序 (PWA) 文件,从 app/views/pwa 提供服务,并使其通过 ERB 可动态渲染。

4 Action Cable

有关详细更改,请参阅 变更日志

4.1 删除

4.2 弃用

4.3 值得注意的更改

5 Action Pack

有关详细更改,请参阅 变更日志

5.1 删除

  • 删除已弃用的常量 ActionDispatch::IllegalStateError

  • 删除已弃用的常量 AbstractController::Helpers::MissingHelperError

  • 删除已弃用的 ActionController::ParametersHash 之间的比较。

  • 删除已弃用的 Rails.application.config.action_dispatch.return_only_request_media_type_on_content_type

  • 删除已弃用的 speakervibratevr 权限策略指令。

  • 删除已弃用的支持,该支持将 Rails.application.config.action_dispatch.show_exceptions 设置为 truefalse

5.2 弃用

  • 弃用 Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality

5.3 值得注意的更改

6 Action View

有关详细更改,请参阅 变更日志

6.1 删除

  • 删除已弃用的 @rails/ujs,转而使用 Turbo。

6.2 弃用

  • 弃用在使用 tag.br 类型标签构建器时将内容传递给空元素。

6.3 值得注意的更改

7 Action Mailer

有关详细更改,请参阅 变更日志

7.1 删除

  • 删除已弃用的 config.action_mailer.preview_path

  • 删除已弃用的参数,通过 :argsassert_enqueued_email_with 提供参数。

7.2 弃用

7.3 值得注意的更改

8 Active Record

有关详细更改,请参阅 变更日志

8.1 删除

  • 删除已弃用的 Rails.application.config.active_record.suppress_multiple_database_warning

  • 删除已弃用的支持,该支持允许使用不存在的属性名称调用 alias_attribute

  • 删除已弃用的 name 参数,用于 ActiveRecord::Base.remove_connection

  • 删除已弃用的 ActiveRecord::Base.clear_active_connections!

  • 删除已弃用的 ActiveRecord::Base.clear_reloadable_connections!

  • 删除已弃用的 ActiveRecord::Base.clear_all_connections!

  • 删除已弃用的 ActiveRecord::Base.flush_idle_connections!

  • 删除已弃用的 ActiveRecord::ActiveJobRequiredError

  • 删除已弃用的支持,该支持允许使用 2 个参数在连接适配器中定义 explain

  • 删除已弃用的 ActiveRecord::LogSubscriber.runtime 方法。

  • 删除已弃用的 ActiveRecord::LogSubscriber.runtime= 方法。

  • 删除已弃用的 ActiveRecord::LogSubscriber.reset_runtime 方法。

  • 删除已弃用的 ActiveRecord::Migration.check_pending 方法。

  • 删除已弃用的支持,该支持允许将 SchemaMigrationInternalMetadata 类作为参数传递给 ActiveRecord::MigrationContext

  • 删除已弃用的行为,该行为支持通过其复数名称引用单数关联。

  • 删除已弃用的 TestFixtures.fixture_path

  • 删除已弃用的支持,该支持允许 ActiveRecord::Base#read_attribute(:id) 返回自定义主键值。

  • 删除已弃用的支持,该支持允许将编码器和类作为第二个参数传递给 serialize

  • 从数据库适配器中删除已弃用的 #all_foreign_keys_valid?

  • 删除已弃用的 ActiveRecord::ConnectionAdapters::SchemaCache.load_from

  • 删除已弃用的 ActiveRecord::ConnectionAdapters::SchemaCache#data_sources

  • 删除已弃用的 #all_connection_pools

  • 删除已弃用的支持,该支持允许将 #connection_pool_list#active_connections?#clear_active_connections!#clear_reloadable_connections!#clear_all_connections!#flush_idle_connections! 应用于当前角色的连接池,而无需提供 role 参数。

  • 删除已弃用的 ActiveRecord::ConnectionAdapters::ConnectionPool#connection_klass

  • 删除已弃用的 #quote_bound_value

  • 删除已弃用的支持,该支持允许引用 ActiveSupport::Duration

  • 删除已弃用的支持,该支持允许将 deferrable: true 传递给 add_foreign_key

  • 删除已弃用的支持,该支持允许将 rewhere 传递给 ActiveRecord::Relation#merge

  • 删除已弃用的行为,该行为会在使用 returnbreakthrow 退出时回滚事务块。

8.2 弃用

  • 弃用 Rails.application.config.active_record.allow_deprecated_singular_associations_name

  • 弃用 Rails.application.config.active_record.commit_transaction_on_non_local_return

8.3 值得注意的更改

9 Active Storage

有关详细更改,请参阅变更日志

9.1 删除

  • 删除已弃用的config.active_storage.replace_on_assign_to_many

  • 删除已弃用的config.active_storage.silence_invalid_content_types_warning

9.2 弃用

9.3 重要变更

10 Active Model

有关详细更改,请参阅变更日志

10.1 删除

10.2 弃用

10.3 重要变更

11 Active Support

有关详细更改,请参阅变更日志

11.1 删除

  • 删除已弃用的ActiveSupport::Notifications::Event#childrenActiveSupport::Notifications::Event#parent_of?

  • 删除已弃用的在不传递 deprecator 的情况下调用以下方法的支持

    • deprecate
    • deprecate_constant
    • ActiveSupport::Deprecation::DeprecatedObjectProxy.new
    • ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new
    • ActiveSupport::Deprecation::DeprecatedConstantProxy.new
    • assert_deprecated
    • assert_not_deprecated
    • collect_deprecations
  • 删除已弃用的ActiveSupport::Deprecation 对实例的委托。

  • 删除已弃用的SafeBuffer#clone_empty

  • 删除已弃用的#to_default_sArray, Date, DateTimeTime

  • 删除已弃用的缓存存储的:pool_size:pool_timeout 选项。

  • 删除已弃用的config.active_support.cache_format_version = 6.1 支持。

  • 删除已弃用的常量ActiveSupport::LogSubscriber::CLEARActiveSupport::LogSubscriber::BOLD

  • 删除已弃用的在 ActiveSupport::LogSubscriber#color 中使用位置布尔值加粗日志文本的支持。

  • 删除已弃用的config.active_support.disable_to_s_conversion

  • 删除已弃用的config.active_support.remove_deprecated_time_with_zone_name

  • 删除已弃用的config.active_support.use_rfc4122_namespaced_uuids

  • 删除已弃用的将 Dalli::Client 实例传递给 MemCacheStore 的支持。

11.2 弃用

11.3 重要变更

12 Active Job

有关详细更改,请参阅变更日志

12.1 删除

  • 删除已弃用的BigDecimal 参数的原始序列化器。

  • 删除已弃用的将数值设置为 scheduled_at 属性的支持。

  • 删除已弃用的retry_on:wait:exponentially_longer 值。

12.2 弃用

  • 弃用 Rails.application.config.active_job.use_big_decimal_serialize

12.3 重要变更

13 Action Text

有关详细更改,请参阅变更日志

13.1 删除

13.2 弃用

13.3 重要变更

14 Action Mailbox

有关详细更改,请参阅变更日志

14.1 删除

14.2 弃用

14.3 重要变更

15 Ruby on Rails 指南

有关详细更改,请参阅变更日志

15.1 重要变更

16 致谢

查看Rails 的完整贡献者列表,以了解为 Rails 的稳定和健壮框架投入大量时间的许多人。向他们所有人致敬。



返回顶部