Rails World 即将到来,我们正在准备以 Rails 7.1 的第一个 beta 版本隆重庆祝 Rails 的 20 周年纪念! 自 Rails 7.0 发布以来,有 超过五千次提交,由 超过 800 位贡献者 完成,因此此版本包含许多新功能和改进。
请帮助我们测试所有这些新内容,以便我们确保 Rails 7.1 的最终版本在生日派对 🎉 上稳定发布。
当您运行 rails new
时,Rails 现在将生成使用 Kamal 或任何其他基于 Docker 的部署设置部署应用程序所需的所有 Dockerfiles。 这些 Dockerfiles 针对生产使用进行了调整,具有适当的缓存层、多阶段构建以最小化镜像大小,以及无论您是否使用 JavaScript 构建环境所需的所有依赖项。
为了补充 has_secure_password
,Rails 7.1 带来了新功能来帮助开发人员构建自己的身份验证系统。
首先,normalizes
声明属性规范化。 这对于在将属性保存到数据库之前对其进行规范化非常有用。
class User < ApplicationRecord
normalizes :email, with: -> email { email.strip.downcase }
end
user = User.create(email: " [email protected]\n")
user.email # => "[email protected]"
其次,authenticate_by
在控制器中验证用户时防止常见的计时攻击。
User.authenticate_by(email: "[email protected]", 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 中对 异步查询的支持 已得到极大扩展。 这使得并行运行多个缓慢查询变得更容易,尤其是那些专注于计算的查询,同时允许请求处理继续进行。 存在用于异步聚合的新方法(例如 count
、sum
等),返回单个记录的方法,以及除 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 是 GitHub 为 Rails 创建的一个新的 MySQL 数据库适配器,旨在提高现有 mysql2 选项的性能、灵活性和嵌入简易性。 它在 GitHub 和 Shopify 上运行,现在作为一种选项在 Rails 中开箱即用地支持。 从 Rails 的下一个主要版本开始,它很可能会成为新的默认选项。
Shopify 通过 切换到复合主键,将针对其最大表的常见查询的性能提高了 5-6 倍,并将缓慢查询的数量减少了 80%。 权衡是插入操作可能会变得明显更慢,但对于读取次数远远大于写入次数的超大型表而言,这可能是一个巨大的改进。 这项工作已被提取到 Active Record 中对复合主键的全面支持中。
perform_all_later
同时排队大量作业Active Job 中的 perform_all_later
方法 已被添加以简化同时排队大量作业的过程。 此强大的补充使您可以有效地排队作业,而不会触发回调。 当您需要一次排队一批作业时,这特别有用,从而减少了对队列数据存储的多次往返的开销。
config.autoload_lib
和 config.autoload_lib_once
以增强自动加载已引入一个 新的配置方法 config.autoload_lib(ignore:)
。 此方法用于通过包含默认情况下未包含的 lib
目录来增强应用程序的自动加载路径。 此外,对于新应用程序,会生成 config.autoload_lib(ignore: %w(assets tasks))
。 (此功能不适用于引擎。)
您现在可以使用 Bun 作为您的 JavaScript 运行时生成新应用程序。 为此,您可以将 --javascript=bun
选项传递给 rails new
。
因此,Rails 7.1 充满了新功能和改进,但我们已经在考虑下一个版本。 我们将在 Rails World 上分享一些想法,并期待听到您的想法。 让我们一起庆祝 Rails 并 共同努力 使其变得更好!
在此期间,请尝试使用 Rails 7.1.0.beta1,并告诉我们您的想法。