2025年9月26日,星期五

重定向源位置日志记录,可过滤的引擎路由,以及更多!

发布者:Greg

周五快乐!经过三周的会议,我是 Greg,为您带来您最喜欢的框架最新变化的新闻。这是一个忙碌的一周,有很多变化,让我们深入了解一下。

Rails 版本 8.0.3 已发布!
Rails 发布了一个新版本。请阅读 CHANGELOG 以获取更改列表。

弃用不带公共 #klass 方法的自定义 ActiveJob 序列化器
通过此更改,自定义 Active Job 序列化器必须有一个公共的 #klass 方法,之前的行为已被弃用。

使引擎路由可在 bin/rails routes 中过滤,改进引擎格式
此拉取请求在 bin/rails routes 中添加了引擎路由过滤和更好的格式。

将所有框架日志订阅者 API 设为私有
一些 Rails 内部日志订阅者类没有被标记为私有 API,此拉取请求纠正了这一点。

引入 with_debug_event_reporting 以启用事件报告器调试模式
此拉取请求通过添加 #with_debug_event_reporting 来更改 ActiveSupport::Testing::EventReporterAssertions,以在测试中启用事件报告器调试模式。

默认不生成系统测试
从 Rails 8.1 开始,脚手架默认不再生成系统测试。由于系统测试执行速度较慢且维护成本较高,因此应将其保留用于关键用户路径。要在脚手架时包含系统测试,请使用 --system-tests=true 选项。

结构化事件订阅者
通过使用 ActiveSupport::StructuredEventSubscriber 子类,结构化事件将通过框架通知引入。可以使用 #emit_event#emit_debug_event 方法发出事件,类似于传统的 LogSubscriber

class MyStructuredEventSubscriber < ActiveSupport::StructuredEventSubscriber
  def notification(event)
    emit_event("my.notification", data: event.payload)
  end
end

MyStructuredEventSubscriber.attach_to :namespace

支持整数分片键
通过此更改,整数可用作分片键。下面是一个示例:

# Now accepts symbols as shard keys.
ActiveRecord::Base.connects_to(shards: {
  1: { writing: :primary_shard_one, reading: :primary_shard_one },
  2: { writing: :primary_shard_two, reading: :primary_shard_two},
})

ActiveRecord::Base.connected_to(shard: 1) do
  # ..
end

允许记录和通知开放重定向
新的 Rails.configuration.action_controller.action_on_open_redirect 配置控制 Rails 如何处理开放重定向漏洞。当设置为 :raise 时,Rails 将为重定向到外部主机引发 ActionController::Redirecting::UnsafeRedirectError,这有助于防止开放重定向攻击。此配置取代了已弃用的 raise_on_open_redirects 设置,使大型代码库能够在(在用 :log(记录警告但允许重定向)或 :notifications(发送 Active Support 通知进行监控)监控后)安全地启用保护。

支持 PostgreSQL 18+ 上的虚拟(未持久化)生成列
此拉取请求增加了对 PostgreSQL 18 及更高版本上的虚拟生成列的支持。使用示例

create_table :users do |t|
  t.string :name
  t.virtual :lower_name,  type: :string,  as: "LOWER(name)", stored: false
  t.virtual :name_length, type: :integer, as: "LENGTH(name)"
end

only_columns 添加到 activerecord
此拉取请求添加了 ActiveRecord::Base.only_columns。其用例类似于 ignored_columns,但它列出要考虑的列,而不是要忽略的列。
这在使用旧版或共享数据库模式时,或在两次部署而不是三次部署中进行安全模式更改时非常有用。

添加记录重定向源位置的设置
此拉取请求添加了 action_dispatch.verbose_redirect_logs 设置,该设置会记录重定向被调用的位置。类似于 active_record.verbose_query_logsactive_job.verbose_enqueue_logs,这会在您的日志中添加一行,显示重定向被调用的位置。
例如

Redirected to https://:3000/posts/1
↳ app/controllers/posts_controller.rb:32:in `block (2 levels) in create'

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

下次再见!

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