2023年5月12日,星期五

Rails World CFP、picture_tag 助手以及更多!

发布者:Greg

你好,我是Greg,为你带来本周 Rails 代码库的变化。

Rails World 论文征集现已开放
本次 CFP(征集论文)的截止日期是 6 月 16 日,议程将包含两个主题下的 26 场演讲和最多六场研讨会。请阅读完整的公告以了解更多详情并提交你的提案!

防止为加密属性重复添加过滤器
当声明 Active Record 加密属性时,会自动将其过滤器添加到 `config.filter_parameters`。在此拉取请求之前,每次重新加载模型时都会重新添加该过滤器。此更改可确保过滤器只添加一次,这样 `config.filter_parameters` 不会无限制地增长。

防止非匿名模块被冻结
在 #48106 中,当模块不是匿名模块时,`Module#deep_dup` 被更改为返回模块本身(而不是副本)。然而,当模块传递给 `ActiveModel::Type::Helpers::Mutable#immutable_value` 时,这会导致非匿名模块通过 `value.deep_dup.freeze` 被冻结。因此,例如,类属性将无法再设置在模块上。
为防止此类问题,此拉取请求从 `immutable_value` 中移除了 `freeze`。`immutable_value` 仅由 `ActiveRecord::PredicateBuilder#build_bind_attribute` 调用,后者只关心其他代码不能修改该值,而不关心该值是否实际上被冻结。

允许 PredicateBuilder 识别带模式命名空间的表名
在此更改之前,`ActiveRecord::PredicateBuilder` 假设列名只以单点分隔的表示法指定。如果表在模式中带命名空间,并且列名以点分隔的表示法指定,则它将模式名用作表名。此拉取请求允许以 **schema.table.column** 和 **table.column** 格式指定列。

支持将 *:message_pack* 作为 cookies 序列化器
此提交增加了对 `config.action_dispatch.cookies_serializer` 的序列化器(如 `config.active_support.message_serializer`)的支持,支持 **:message_pack** 和 **:message_pack_allow_marshal**。

支持将 *:message_pack* 作为消息序列化器
此更改增加了对 `MessageEncryptor` 和 `MessageVerifier` 的序列化器(如 **:message_pack**)的支持,因此也作为 `config.active_support.message_serializer` 的一个选项。

将消息序列化器的默认值设置为 *:json_allow_marshal*
此拉取请求将 `config.load_defaults 7.1` 设置的默认消息序列化器从 **:json** 更改为 **:json_allow_marshal**,以便升级的应用可以继续读取旧消息而无需额外配置。
其目的是在 Rails 7.2 中,在应用程序生成 JSON 序列化消息一段时间后,最终将默认值更改为 **:json**(不带 Marshal 回退)。
在 Rails 7.2 之前,应用程序可以通过手动设置 `config.active_support.message_serializer = :json` 来选择仅 JSON 序列化。

处理空的缓存键列表
通过此更改,如果 `read_multi`、`write_multi` 和 `fetch multi` 以某种方式被调用时传入了空列表,它们将提前退出。
在后续的拉取请求中,对 `delete_multi 也做了相同的更改。

使 *increment_counter*/*decrement_counter* 接受一个金额参数
此拉取请求为 `increment_counter` 和 `decrement_counter` 引入了 **by** 选项,以便更容易地按任意值更改计数器。示例用法

Company.increment_counter(:users_count, 5, by: 3)

使 Active Record 的查询缓存成为 LRU
Active Record 查询缓存现在会淘汰最近最少使用的条目,默认大小为 100 个条目。缓存大小可以通过 `database.yml` 配置。

development:
  adapter: mysql2
  query_cache: 100

也可以完全禁用它。

development:
  adapter: mysql2
  query_cache: false

添加一个 *picture_tag* 辅助方法
此拉取请求添加了对 HTML picture 标签的支持。它支持传递字符串、数组或块,并通过 **:image** 键直接将属性传递给 img 标签。
由于 picture 标签需要一个 img 标签,你提供的最后一个元素将用于 img 标签。
为了对 picture 标签进行完全控制,可以传递一个块,该块将相应地填充标签的内容。有关用法示例,请参阅拉取请求。

为 *assert_enqueued_email_with* 添加匹配器支持
目前 `assert_enqueued_with` 允许你传递 proc 来匹配 `args`。然而,`assert_enqueued_email_with` 不允许你对 `args` 和 `params` 执行此操作。
此拉取请求使 `assert_enqueued_email_with` 接受用于 args 和 params 的 proc。

assert_enqueued_email_with DeliveryJob, params: -> p { p[:token] =~ /\w+/ } do
  UserMailer.with(token: user.generate_token).email_verification.deliver_later
end

你可以在此处查看所有更改的完整列表。
上周,我们有28 位贡献者为 Rails 代码库做出了贡献!

下次再见!

订阅以通过邮件获取这些更新。