2024 年 12 月 27 日,星期五

今年的 Ruby on Rails

发布者:Greg

我是 Greg、Vipul、Wojciech 和 Zzak,为您带来过去一年 Rails 的发展总结。今年非常忙碌,共有近 4000 次提交,来自 555 位贡献者,以及 50 个发布版本,其中包括 Rails 8!

对于今年的年终特刊,我们团队中的每个人都挑选了自己最喜欢的几个年度 Pull Request。

Rails 基金会 2024 年度总结
Amanda 总结了 Rails 基金会今年的工作以及她明年的计划。

添加默认 PWA manifest 和 service worker 文件
今年,Rails 在渐进式 Web 应用 (PWA) 方面获得了大量支持,从新生成的 Rails 应用开始,现在都包含 manifest 和 service worker 文件,可以成为功能齐全的渐进式 Web 应用。

添加 allow_browser 以设置应用的最低版本要求
现在您可以轻松指定支持的浏览器,从而允许访问您的应用程序。

通过 Kredis 限制器类型为 Action Controller 添加速率限制
Rails 今年获得了内置的速率限制器。最初它依赖于 Kredis,但后来 快速重构,改为使用 Rails 缓存存储。

class SessionsController < ApplicationController
  rate_limit to: 10, within: 3.minutes, only: :create
end

class SignupsController < ApplicationController
  rate_limit to: 1000, within: 10.seconds,
    by: -> { request.domain }, with: -> { redirect_to busy_controller_url, alert: "Too many signups!" }, only: :new
end

默认生成 devcontainer 文件
此更改会在创建新应用时生成一个 .devcontainer 文件夹及其内容。该 .devcontainer 文件夹包含了 启动应用并在远程容器中进行开发 所需的一切。可以使用 --skip-devcontainer 选项跳过这些文件。

为 Rails 控制台添加自定义提示
Rails 控制台现在会用名称和颜色(生产环境为红色)指示当前的 Rails 环境。

Rails 8 默认添加 Kamal
此 PR 默认添加 Kamal 用于部署,包括生成特定于 Rails 的 config/deploy.yml。可以使用 --skip-kamal 跳过。在 Kamal 的 官方网站 上了解更多关于 Kamal 的信息。

Rails 8 中将资源管道默认更改为 Propshaft
Sprockets 很好地为我们服务了,但在 Rails 8 中,是时候将火炬传递给 Propshaft 了。

添加一个基本的 sessions 生成器
此更改添加了一个新的 sessions 生成器,为使用数据库跟踪会话的身份验证系统提供了一个基本起点。

# Generate with...
bin/rails generate session

# Generated files
app/models/current.rb
app/models/user.rb
app/models/session.rb
app/controllers/sessions_controller.rb
app/views/sessions/new.html.erb
db/migrate/xxxxxxx_create_users.rb
db/migrate/xxxxxxx_create_sessions.rb

该生成器后来被重命名为“authentication”生成器,并获得了一系列改进。

实施新的维护策略
Rails 的维护策略今年得到了更新。主要变化是:

  • 发布版本由预定义的固定时间段维护。一年用于错误修复,两年用于安全修复。
  • 取消了严重安全问题和常规安全问题之间的区别。
  • Npm 版本控制更新,以匹配不使用预发布分隔符。

Rails 8 默认使用 Thruster
Thruster 是一个资产压缩和缓存代理,具有 X-Sendfile 加速功能,可以加快简单的生产就绪 Rails 应用程序的部署速度。它与 Puma 一起运行,通常位于 Kamal 2 代理后面,后者提供 HTTP/2 和 SSL 自动证书,以帮助您的应用程序在开放互联网上高效且安全地运行。

此更改从 Rails 8 开始,在 Dockerfile 中默认配置 Thruster 的使用。

添加对 SQLite3 全文搜索和其他虚拟表支持
Rails 现在支持 SQLite3 全文搜索和其他虚拟表。以前,添加 SQLite3 虚拟表会弄乱 schema.rb,但通过此更改,可以使用 create_virtual_table 安全地添加虚拟表。

添加 Solid Cache
Solid Cache 将成为 Rails 8 生产部署的默认缓存后端。

添加 Solid Queue
将 Solid Queue 配置为默认的 Active Job 后端,与 Solid Cache 并列。可以使用 --skip-solid 跳过两者。

添加 Solid Cable
此更改开始将 Solid Cable 作为生产环境中的默认 Action Cable 适配器,在 config/database.yml 中配置为一个单独的队列数据库。它将消息保存在表中并持续轮询更新。

这样就可以在不需要 Redis 的其他用途时,放弃对 Redis 的常见依赖。尽管进行了轮询,但在大多数情况下,Solid Cable 的性能与 Redis 相当。并且在所有情况下,当 Redis 不再是 Action Cable 功能的必需依赖项时,可以更轻松地部署 Rails。

静默日志中的健康检查请求
添加 Rails::Rack::SilenceRequest 中间件,并通过 config.silence_healthcheck_path = path 使用它来静默对“/up”的请求。这可以防止 Kamal 所需的健康检查使生产日志混乱。

添加 Parameters#expect 以安全地过滤和必需的参数
此 PR 添加了一种处理参数的新方法,从而可以更全面地控制您期望在控制器操作中接收的内容。

# Before
params.require(:table).permit(:attr)

# After
params.expect(table: [ :attr ])

整理错误页面
Rails 内置的错误页面已更新,这是新外观的预览: Screenshot 2024-09-26 at 10 46 56 AM

支持加载 SQLite3 扩展
sqlite3 gem v2.4.0 引入了对加载作为关键字参数传递给 Database.new 的扩展的支持。此 PR 利用该功能,允许使用文件系统路径或响应 to_path 方法的模块名称,在 config/database.yml 文件中配置扩展。

添加 ActiveSupport::Testing::NotificationAssertions 测试助手模块
通过此添加,我们现在可以使用各种测试助手方法来进行通知断言。

assert_notification("post.submitted", title: "Cool Post") do
  post.submit(title: "Cool Post") # => emits matching notification
end

assert_notifications_count("post.submitted", 1) do
  post.submit(title: "Cool Post")
end

assert_no_notifications("post.submitted") do
  post.destroy
end

notifications = capture_notifications("post.submitted") do
  post.submit(title: "Cool Post") # => emits matching notification
end

您可以在 此处 查看所有更改列表。 今年有 555 位贡献者 为 Rails 代码库做出了贡献!

圣诞快乐,新年快乐!下次见!

订阅以通过邮件获取这些更新。