Rails World刚刚开始,我们将亲自与社区欢聚一堂,庆祝 Rails 20 周年和 Rails 7.1 的发布。
自 Rails 7.0 以来,此版本已由800 多名贡献者做出了5000 多次提交,因此它包含了新功能和改进。
当您运行 .Rails 时,Rails 现在将生成使用 Kamal或任何其他基于 Docker 的部署设置部署应用程序所需的所有 Dockerfile rails new
。这些 Dockerfile 经过调整,适合生产使用,具有适当的缓存层、多阶段构建以最小化图像大小,以及无论您是否使用 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是一个用于 Rails 的新 MySQL 数据库适配器,由 GitHub 创建,旨在改进现有 mysql2 选项的性能、灵活性和嵌入简易性。它在 GitHub 和 Shopify 的生产环境中运行,现在作为一个选项在 Rails 中提供开箱即用的支持。从 Rails 的下一个主要版本开始,它可能会成为新的默认值。
Shopify 通过切换到复合主键,将针对最大表的常见查询的性能提高了 5-6 倍,并将慢速查询的数量减少了 80% 。代价是插入可能会明显变慢,但对于读取次数多于写入次数的非常大的表来说,这可能是一个巨大的改进。这项工作已被提取为对 Active Record 中复合主键的完全支持。
perform_all_later
perform_all_later
添加 Active Job 中的方法是为了简化同时对大量作业进行排队的过程。这个强大的附加功能使您可以有效地对作业进行排队,而无需触发回调。当您需要一次将一批作业排入队列时,这特别有用,从而减少多次往返队列数据存储的开销。
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 上分享我们的一些想法,并且我们将亲自与社区互动,讨论想法并收集一些反馈。
我们期待接下来发生的事情,希望您也是如此!