为什么当ID存在时,Composer中的数字标签会失效

当我尝试创建数字标签(例如 2026)时,如果没有其他标签使用相同的 ID 2026,它就能正常工作。但如果该 ID 已被占用,我得到的将是那个现有标签,而不是 2026。

我很确定这是一个旧 bug,后来在某个时候被修复了。还是我记错了,根本不该使用数字标签?:thinking:

总之,我认为这是一个 bug——而且我非常希望能用年份作为标签。

应支持数字标签,且当前规范 URL 格式旨在避免这种歧义。

例如,如果标签名为 2026,其标签 ID 为 3,则规范 URL 应为:

/tag/2026/3

存在歧义的形式是较旧的/遗留 URL:

/tag/2026

这可以被解释为“ID 为 2026 的标签”,因此如果另一个标签具有该 ID,它可能会解析为该其他标签,而不是名为 2026 的标签。


您尝试在哪里使用或访问该标签?如果链接由 Discourse 自身生成,我预计它会使用规范化的 /tag/:slug/:id URL。如果您是手动输入 URL、使用旧的保存链接、自定义主题/插件链接,或导入的/侧边栏/自定义 URL,它可能仍在使用存在歧义的遗留格式,并解析到错误的标签。

如果可能的话,我认为我们应该将 /tag/:foo 中的 :foo 始终视为一个 slug,并要求使用 /tag/:foo/:id 这种格式来表示 ID,其中 :foo 可以是任意字符(例如,在不知道或不关心具体值时使用 -)。

这将有助于向后兼容,也能在已知 slug 但未知 ID 的情况下提供帮助,这种情况在标签中很常见,因为名称通常是常用的引用方式。

目前,ID 的主要作用是支持本地化。

1 个赞

通常是在创建主题并添加标签时。或者我应该直接说在添加标签时。

举个实际例子。

在撰写主题时,我尝试创建标签 2013。但我得到的是 sahara,因为它是 /tag/sahara/2013

顺便问一下 :smirking_face: 是的,在安全模式下也会发生同样的情况。

所以,

这没错,而且不久之前确实是这样。

2 个赞

感谢您提供的具体示例。我已经能够复现该问题,并正在着手修复。

在测试过程中,我注意到如果数字标签也没有对应的 ID,同样无法创建。例如,尝试创建标签 2939858339 时,系统不会执行任何操作,也不会为主题添加任何标签。

2 个赞