您好,我是 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
中的 freeze
。 immutable_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
的支持,作为 MessageEncryptor
和 MessageVerifier
的序列化程序,以及 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_multi
、write_multi
和 fetch multi
如果以某种方式使用空列表调用,那么它们将提前退出。
在后续 Pull 请求中为 delete_multi
进行了相同的更改。
让 increment_counter/decrement_counter 接受一个金额参数
此 Pull 请求为 increment_counter
和 decrement_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
不允许你对 args
和 params
进行此操作。
此 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 代码库做出了贡献!
下次见!
订阅即可获得发送至邮箱的更新。