2023 年 9 月 13 日,星期三

Rails 7.1 Beta 1:Dockerfile、自定义身份验证、更多异步查询,以及更多!

发布者:rafaelfranca

Rails World 正在迅速临近,我们正准备以 Rails 7.1 的首个 beta 版本来庆祝 Rails 的 20 周年。自 Rails 7.0 发布以来,已有 超过五千次提交,由 超过 800 位贡献者 完成,因此本次发布包含了大量新功能和改进。

请帮助我们测试所有这些新功能,以便我们能确保在生日派对上推出一个稳健的 Rails 7.1 最终版本 🎉

新应用的 Dockerfiles

现在,当您运行 rails new 时,Rails 会生成部署您的应用程序所需的所有 Dockerfiles,以使用 Kamal 或任何其他基于 Docker 的部署设置。这些 Dockerfiles 针对生产环境进行了优化,具有适当的缓存层、多阶段构建以最小化镜像大小,以及您是否使用 JavaScript 构建环境所需的所有依赖项。

构建自己的身份验证改进

为了补充 has_secure_password,Rails 7.1 引入了新功能,帮助开发人员构建自己的身份验证系统。

首先,normalizes 声明了一个属性的规范化。这在将属性保存到数据库之前对其进行规范化非常有用。

class User < ApplicationRecord
  normalizes :email, with: -> email { email.strip.downcase }
end

user = User.create(email: " CRUISE-CONTROL@EXAMPLE.COM\n")
user.email                  # => "cruise-control@example.com"

其次,authenticate_by 在控制器中对用户进行身份验证时,可以防止常见的时序攻击。

User.authenticate_by(email: "rafael@rubyonrails.org", password: "railsrocks")

第三,generates_token_for 可用于实现密码重置、电子邮件确认以及其他需要一次性令牌的功能。

class User < ApplicationRecord
  has_secure_password

  generates_token_for :password_reset, expires_in: 15.minutes do
    # Last 10 characters of password salt, which changes when password is updated:
    password_salt&.last(10)
  end
end

user = User.first

token = user.generate_token_for(:password_reset)
User.find_by_token_for(:password_reset, token) # => user
# 16 minutes later...
User.find_by_token_for(:password_reset, token) # => nil

最后,has_secure_password 现在可以在更新密码时自动验证当前密码。这对于检查尝试更新密码的用户是否知道当前密码非常有用。

# Schema: User(name:string, password_digest:string)
class User < ActiveRecord::Base
  has_secure_password
end

user = User.new(name: "rafael", password: "railsrocks", password_confirmation: "railsrocks")
user.save                                                                      # => true
user.update(password: "pwn3d", password_challenge: "")                         # => false, challenge doesn't authenticate
user.update(password: "railsGetsEvenBetter", password_challenge: "railsrocks") # => true

Active Record 的异步查询功能扩展

Active Record 中对异步查询的支持得到了极大的扩展。这使得并行运行多个慢速查询(尤其是那些专注于计算的查询)变得更加容易,同时允许请求的处理继续进行。现在有新的方法用于异步聚合(如 countsum 等)、返回单个记录的方法,以及除 Relation 之外的其他所有方法。

  • async_count
  • async_sum
  • async_minimum
  • async_maximum
  • async_average
  • async_pluck
  • async_pick
  • async_ids
  • async_find_by_sql
  • async_count_by_sql

内置支持 Trilogy MySQL 适配器

Trilogy 是 GitHub 为 Rails 创建的一个新的 MySQL 数据库适配器,旨在改进现有 mysql2 选项的性能、灵活性和嵌入便捷性。它已在 GitHub 和 Shopify 的生产环境中运行,现在在 Rails 中开箱即用,作为一种选项提供支持。从下一个 Rails 主版本开始,它很可能成为新的默认选项。

Active Record 支持复合主键

Shopify 通过切换到复合主键,将常用查询在其最大表上的性能提高了 5-6 倍,并将慢查询数量减少了 80%。缺点是插入操作可能会显着变慢,但对于写入量远少于读取量的非常大的表来说,这可能是一个显著的改进。这项工作已被提取并完全支持 Active Record 中的复合主键。

使用 perform_all_later 批量入队大量作业

Active Job 中的 perform_all_later 方法被添加进来,以简化一次性入队大量作业的过程。这个强大的附加功能允许您高效地入队作业,而无需触发回调。当您需要一次性入队一批作业时,这尤其有用,可以减少与队列数据存储的多次往返的开销。

引入 config.autoload_libconfig.autoload_lib_once 以增强自动加载

引入了一个新的配置方法 config.autoload_lib(ignore:)。此方法用于增强应用程序的自动加载路径,包括默认不包含的 lib 目录。此外,新应用程序还会生成 config.autoload_lib(ignore: %w(assets tasks))。(此功能不适用于引擎。)

支持 Bun

您现在可以使用 Bun 作为 JavaScript 运行时来生成新应用程序。为此,您可以将 --javascript=bun 选项传递给 rails new

庆祝本次发布并展望未来

Rails 7.1 包含了大量新功能和改进,但我们已经在考虑下一个版本了。我们将在 Rails World 上分享一些我们的想法,并且也期待听到您的想法。让我们一起庆祝 Rails,并且共同努力,让它变得更好!

在此期间,请尝试使用 Rails 7.1.0.beta1,并告诉我们您的想法