Rails Rails 7.1【发布】:Dockerfiles、BYO 身份验证、更多异步查询等!

rocLv · 2023年10月09日 · 最后由 willx 回复于 2023年10月11日 · 756 次阅读

Rails World刚刚开始,我们将亲自与社区欢聚一堂,庆祝 Rails 20 周年和 Rails 7.1 的发布。

自 Rails 7.0 以来,此版本已由800 多名贡献者做出了5000 多次提交,因此它包含了新功能和改进。

新应用程序的 Dockerfile

当您运行 .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 的更多异步查询

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是一个用于 Rails 的新 MySQL 数据库适配器,由 GitHub 创建,旨在改进现有 mysql2 选项的性能、灵活性和嵌入简易性。它在 GitHub 和 Shopify 的生产环境中运行,现在作为一个选项在 Rails 中提供开箱即用的支持。从 Rails 的下一个主要版本开始,它可能会成为新的默认值。

Active Record 中对复合主键的支持

Shopify 通过切换到复合主键,将针对最大表的常见查询的性能提高了 5-6 倍,并将慢速查询的数量减少了 80% 。代价是插入可能会明显变慢,但对于读取次数多于写入次数的非常大的表来说,这可能是一个巨大的改进。这项工作已被提取为对 Active Record 中复合主键的完全支持。

将大量作业排队perform_all_later

perform_all_later添加 Active Job 中的方法是为了简化同时对大量作业进行排队的过程。这个强大的附加功能使您可以有效地对作业进行排队,而无需触发回调。当您需要一次将一批作业排入队列时,这特别有用,从而减少多次往返队列数据存储的开销。

介绍config.autoload_libconfig.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 上分享我们的一些想法,并且我们将亲自与社区互动,讨论想法并收集一些反馈。

我们期待接下来发生的事情,希望您也是如此!

都支持 bun 了。真是 6

生成的 Dockerfile + Kamal 很 nice

Mark24 回复

rails 对 bun 的支持很快,我在小公司里,向上司推荐 bun, 直接表示不知道不想用😂

Rails 这个 Promise 有 Promise.all 这种操作吗,看起来应用起来还有点难受

需要 登录 后方可回复, 如果你还没有账号请 注册新账号