大家好,我是 Wojtek。Rails World 下周就要开始了。目前 This Week In Rails 的三位编辑——Greg、Emmanuel 和我——都将参加。我们准备了一些带有通讯标志的贴纸,所以一定要找到我们来领取一张!现在,让我们深入了解 Rails 代码库的最新更新。
Rails 7.1.0.rc1 发布
这将我们带离 Rails 7.1 的最终发布又近了一步。
为日志广播添加公共 API
此功能已经存在一段时间,但直到现在才成为公共 API。日志广播允许将日志消息发送到不同的接收器(STDOUT、文件等),并且在开发环境中默认使用,用于将日志同时写入 STDOUT 和 “development.log” 文件。
broadcast = ActiveSupport::BroadcastLogger.new(Logger.new(STDOUT), Logger.new("development.log"))
broadcast.info("Hello!") # The "Hello!" message is written on STDOUT and in the log file.
允许将 File 或 Pathname 附加到 has_one_attached
这在测试中创建模型时可能特别有用,因为传递 File 或 Pathname(例如来自 file_fixture)更容易。
User.create!(avatar: File.open("image.jpg"))
User.create!(avatar: file_fixture("image.jpg"))
引入 ActionView::TestCase.register_parser
注册一个可调用对象,用于解码给定 MIME 类型的渲染内容。
每个注册的解析器还将定义一个 #rendered.$MIME 帮助方法,其中 $MIME 对应于 mime 参数的值。
register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }
默认情况下,会注册 :html 和 :json 的解析器。
为标签名添加 HTML 标签验证
在 tag 和 content_tag 帮助方法中添加了对 HTML 标签名的验证。这些方法现在会检查提供的标签名是否符合 HTML 规范。如果提供了无效的 HTML 标签名,该方法将引发一个带有适当错误消息的 ArgumentError。
为 ActiveStorage::Blob#signed_id 添加 expires_at 选项
提供 expires_at 将在给定时间后使链接过期。
rails_blob_path(user.avatar, disposition: "attachment", expires_at: 30.minutes.from_now)
引入 ActionMailer::FormBuilder
在 mailer 中使用 default_form_builder 方法来设置由该 mailer 渲染的模板的默认表单构建器。这与 Action Controller 中的行为一致。
将 deep_merge 提取到 Active Support DeepMergeable 中
ActiveSupport::DeepMergeable 模块允许类通过实现 merge!(other, &block) 方法来提供 deep_merge 和 deep_merge! 方法。只有当值兼容时(根据 deep_merge? 方法),值才会被深度合并。默认情况下,这仅包括同一类或其子类的实例。类可以覆盖 deep_merge? 来进一步限制或扩展深度可合并值域。
这使得 ActionController::Parameters 支持 deep_merge。
修复 Range#overlap? 忽略空范围
以前,当其中一个范围实际上是“空”时,#overlap? 会错误地返回 true。
Ruby 3.3 引入了 Range#overlap?,因此这也确保了两个实现返回相同的结果。
对 SQLite3 适配器的连接配置进行性能调优
对于 Rails 应用程序,以正常同步模式、固定日志大小、健康的共享内存缓冲区和共享缓存的写时复制日志(Write-Ahead-Log)的性能平均可以提高 2 倍。
允许使用简单的最大重试次数配置 SQLite3 busy_handler
对于性能敏感型应用程序,在没有延迟的情况下重试忙碌的连接是一种首选做法。添加对 database.yml retries 整数的支持,该整数用于一个简单的 busy_handler 函数,该函数以无指数退避的方式重试忙碌的连接,最多达到 retries 的最大次数。
将 Active Job scheduled_at 属性设置为 Time 对象
将 scheduled_at 的值序列化和反序列化为 Time 对象。还将 enqueued_at 反序列化为 Time 对象。此外,为 scheduled_at= 赋值数字/epoch 值已被弃用。
修复 MySQL schema 中 check constraint 表达式的引号重复转义
带有已包含引号的表达式的 check constraint,在 mysql2 适配器下会导致无效的 schema dump。
您可以在 这里查看所有更改的列表。
上周,我们有 39 位贡献者为 Rails 代码库做出了贡献!
下次再见!
订阅以通过邮件获取这些更新。