2023 年 3 月 10 日星期五

本周 Rails 时刻:改进自定义命名空间自动加载、Object#with 等等!

作者:greg

嗨,大家好,我是 Greg,为您带来 Rails 代码库中的最新变更。

锁定生产环境中的 Rails 应用程序以确保安全
Rails 生成的当前 Dockerfile 以非 root 用户身份运行,这可以防止对操作系统进行修改,但会对所有 gem 和应用程序本身开放。此变更锁定应用程序 gem,仅开放对以下目录的访问权限:db、log、storage、tmp。

改进对自定义命名空间的支持
此修补程序改进了对自定义根命名空间的支持,并巩固了在 Rails 中集成 Zeitwerk 时设计中的一个方向。在 pull 请求中对原因和方法进行了很好的解释。

将类名称添加到 ActiveModel::MissingAttributeError 错误消息中
当一个属性缺失时,之前的消息并未明确说明是哪个类缺失该属性,尤其是在有多个类可能会缺失该属性的情况下。通过将类名称添加到错误消息中,可以更轻松地进行调试。

修复在使用复合查询约束时将关联置为无效
给定类似这样的模型设置

class BlogPost < ApplicationRecord
  query_constraints :blog_id, :id

  has_many :comments, query_constraints: [:blog_id, :blog_post_id]
end

class Comment < ApplicationRecord
  query_constraints :blog_id, :blog_post_id

  belongs_to :blog_post, query_constraints: [:blog_id, :blog_post_id]
end

通过此变更,现在可以将 blog_post.comments = []comment.blog_post = nil 关联置为无效,这应导致复合查询约束的所有部分均变为无效,这意味着受影响的注释上的 blog_idblog_post_idnil

使作业的 display_name 达到故障保护
延迟作业使用 display_name 方法来记录有关作业的信息,包括故障消息。每当作业类被移动或删除时,仍计划的实例将不能再被常量化,导致 display_name 及其日志方法引发异常。在某些情况下(例如在救援块中发生日志记录时),可能会终止整个延迟作业工作程序。通过此变更,该工作程序能够轻松处理故障作业并继续工作,同时输出适当的日志。

在 PostgreSQL add_index 中同时允许 include 和 where
近期,PostgreSQL 中创建索引时添加了对 include 选项的支持,但当与 where 选项联合使用此选项时,INCLUDE 和 WHERE 片段顺序错误,导致迁移出错。此请求更改了添加索引时的 INCLUDE 和 WHERE 片段的顺序,以使查询有效。在转储架构时,它还更新了在创建索引语句中预期的顺序。

将 Rails 路由搜索扩展到所有表内容
此请求将 Rails/info/routes 页面上的搜索字段扩展到还可以搜索

  • 路由名称(含或不含 _path 和 _url 扩展名)
  • HTTP 动词(例如 GET/POST/PUT 等)
  • 控制器#动作

在此更改之前,搜索字段仅限于路由路径。

增强 has_secure_password 以便也能生成 password_salt 方法

通过此更改,has_secure_password 会生成一个 #{attribute}_salt 方法,用于返回计算密码摘要时所用的盐。每次更改密码时,盐都会更改,因此可用于使用 generates_token_for 创建一次性密码重置令牌

class User < ActiveRecord::Base
  has_secure_password
  generates_token_for :password_reset, expires_in: 15.minutes do
    password_salt&.last(10)
  end
end

使 irb 成为 railties 依赖项
此请求将 irb 添加到 railties 的依赖项中,因此使用旧版 Ruby 的用户可以受益于最新版的 irb,而无需局限于随 Ruby 安装附带的版本。

实现 Object#with
此请求添加 Object#with 以设置和恢复一个块周围的公共属性

client.timeout # => 5
client.with(timeout: 1) do
  client.timeout # => 1
end
client.timeout # => 5

有关此更改的更多示例和详细信息,请参见此请求。

您可以在此处查看所有更改列表 此处 过去一周,有 30 位贡献者为 Rails 代码库做出贡献!

下期再见!

订阅以通过邮件收到这些更新。