2023 年 5 月 12 日星期五

Rails World CFP、picture_tag Helper 等等!

由 Greg 发布

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

Rails World 征稿现已开放
征稿截止到 6 月 16 日,议程中 2 条轨道有 26 场演讲的空位,还有最多 6 场研讨会。阅读完整公告了解详情并提交您的提案!

防止加密属性重复过滤
当声明 Active Record 加密属性时,会自动将过滤器添加到 config.filter_parameters。在此 Pull 请求之前,每次重新加载模型时,会重新添加过滤器。此变更确保仅添加一次过滤器,以便 config.filter_parameters 不再不受限地增长。

防止非匿名模块被冻结
在 #48106 中,当模块不是匿名模块时,Module#deep_dup 会更改为返回模块本身(不是副本)。但会导致非匿名模块通过 value.deep_dup.freeze 传递到 ActiveModel::Type::Helpers::Mutable#immutable_value 时被冻结。例如,class 属性便无法在模块中设置。
为了防止此类问题,此 Pull 请求移除了 immutable_value 中的 freezeimmutable_value 仅由 ActiveRecord::PredicateBuilder#build_bind_attribute 调用,而它仅关注其他代码无法改变值,而非值是否实际冻结。

允许 PredicateBuilder 识别模式名称空间表名
在此变更之前,ActiveRecord::PredicateBuilder 假设列名仅使用包含单个句点的点分法进行指定。如果列在模式的名称空间表中使用点分法指定,则会将模式名用作表名。此 Pull 请求允许列以 模式.表.列 以及 表.列 格式指定。

支持 :message_pack 作为 cookie 序列化程序
此提交为 :message_pack:message_pack_allow_marshal 添加了对 config.action_dispatch.cookies_serializer 的序列化程序的支持,与 config.active_support.message_serializer 相同。

支持 :message_pack 作为消息序列化程序
此变更添加了对 :message_pack 的支持,作为 MessageEncryptorMessageVerifier 的序列化程序,以及 config.active_support.message_serializer 的一个选项。

默认消息序列化程序为 :json_allow_marshal
此 Pull 请求更改了 config.load_defaults 7.1 设置的默认消息序列化程序,从 :json 改为 :json_allow_marshal,以便升级的应用程序可以继续读取旧消息,而无需其他配置。
在使用 JSON 序列化消息的应用程序经过一段时间后,我们的目的是最终在 Rails 7.2 中将默认值更改为 :json(无 Marshal 回退)。
应用程序可以在 Rails 7.2 之前选择仅进行 JSON 序列化,方式是手动设置 config.active_support.message_serializer = :json

处理缓存密钥的空列表
通过此更改,read_multiwrite_multifetch multi 如果以某种方式使用空列表调用,那么它们将提前退出。
在后续 Pull 请求中为 delete_multi 进行了相同的更改。

increment_counter/decrement_counter 接受一个金额参数
此 Pull 请求为 increment_counterdecrement_counter 引入了 by 选项,以便更容易根据任意值更改计数器。示例用法

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

让 ActiveRecord 的查询缓存成为 LRU
ActiveRecord 查询缓存现在会驱逐最近最少使用的条目,其中 100 个条目为默认值。缓存大小可以通过 database.yml 进行配置

development:
  adapter: mysql2
  query_cache: 100

它还可以被彻底禁用

development:
  adapter: mysql2
  query_cache: false

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

assert_enqueued_email_with 添加匹配器支持
当前 assert_enqueued_with 允许你传递 procs 以匹配 args。但是,assert_enqueued_email_with 不允许你对 argsparams 进行此操作。
此 Pull 请求使 assert_enqueued_email_with 接受 args 和 params 的 procs

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

你可以在此处查看所有变更的列表。
在过去的一周里,有 28 位贡献者为 Rails 代码库做出了贡献!

下次见!

订阅即可获得发送至邮箱的更新。