Slugify问题:「digital_mind|电子大脑」标签无法访问

Created: 09 Feb 2026

Author:  Chen Xie

摘要

Jekyll Debug经验:Collections功能的逻辑学习

AI使用经验

不要一来就使用agent,让AI开始改代码。先使用ask,定位问题在哪。

因为,Bug不一定需要很大的代码量,最重要的找到问题所在。

问题

点击首页、博客正文页的标签,显示无法访问

image

问题原因

博客正文页的标签链接,在_layouts/post.html中:

标签页是基于_tags_page/[tag_name|标签名].md​文件,渲染到_site/tag/[tag_name-标签名]​,注意文件名会被slugify处理。

然后发现: 在页面中,使用``​,digital_mind|电子大脑​会变成digital-mind-电子大脑​,但是_tag_page/digital_mind|电子大脑.md​文件编译到_site/tag/​下变成了digital_mind-电子大脑​,导致http://127.0.0.1:4000/tag/digital-mind-电子大脑​无法访问到_site/tag/digital_mind-电子大脑

image

因此,在页面中``​会将所有的特殊字符都变成-​,即digital_mind|电子大脑​会变成digital-mind-电子大脑​,所以,核心是搞清楚_tag_page/digital_mind|电子大脑.md​到_site/tag/digital_mind-电子大脑的逻辑是什么?

尝试

尝试一

修改tag_generator.rb​,将_tag_page/​下的文件都变为digital-mind-电子大脑.md

结果:

可以访问了,但是,关联不出标签下的内容:

image

对应代码:

image

说明文章是需要原标签名关联出来的。

尝试二

_tag_page/分别定义title和slug参数,用于检索内容,文件名保持尝试一的情况:

image

结果:

_site/tag/​下还是生成digital_mind-电子大脑​文件,说明不是受_tag_page/​的文件名影响的,而是受title​orslug参数影响。

尝试三

通过问AI: jekyll 是如何将_tags_page/下的tag.md文件编译到_site/tag文件下的?

得到回答:

简短流程(针对你当前工程的配置)

总结:_tags_page 下的文件之所以出现在 _site/tag/ 下,是因为集合被设置为 output: true 且为该集合指定了 /tag/:title/ 的 permalink,构建时 Jekyll 按模板生成对应目录并写入 index.html。

最终解决:将:title​改为:slug,解决

但是原理还是不够清楚,见后面深入理解。

image

深入理解

对Jekyll的理解:Collections

问: 通过_config.yml配置,为什么jekyll知道去_tag_page目录找标签聚合页的每个标签页面的md文件?

答: 通过_config.yml​中collections:​配置的集合​的名字,在前面加上_,找对应的目录。

问: 配置中permalink: /tag/:slug/​的:slug是怎么取值的?

答: 按以下默认顺序:Front Matter中的slug -> Front Matter中的title(slug处理后) -> 文件名(slug处理后)

配置: collections.tags_page.permalink = "/tag/:slug/"
↓
Jekyll 扫描 _tags_page/ 文件夹
↓
对每个文件:
  1. 读取 front matter
  2. 确定 slug 值(优先级:slug > title > 文件名)
  3. 替换 permalink 中的 :slug
  4. 生成到 _site/tag/[slug]/index.html

问: 那如果front matter中的slug值,也有特殊字符,比如digital_mind|电子大脑,会被slugify处理吗?

答: 通过我的测试,会被slugify处理,且与处理结果一致。digital_mind|电子大脑​会变成digital-mind-电子大脑​。这与网上的资料记录不一致(所以问AI 回答也是错误的)

发现一个问题: 如上图,title和slug都是digital_mind|电子大脑​,但是_config.yml​中,配置/tag/:title/​和/tag/:slug/​,在_site/tag/下生成的目录名称不同,:title​是digital_mind-电子大脑​,:slug​是digital-mind-电子大脑

image

image

jekyll博客中page_tag.html中如何关联出标签下的文章

site.tags - Jekyll的全局变量,包含所有文章的标签及其对应的文章列表。它是一个键值对对象,格式为:

{
  "tag1": [post1, post2, ...],
  "tag2": [post3, post4, ...],
  ...
}

所以,如果post(博文)中的标签是digital_mind|电子大脑​,那么这里的取值需要是digital_mind|电子大脑​,而不能是slugify之后的digital-mind-电子大脑​或digital_mind-电子大脑

所以,_tags_page​下的md文件可以是以下写法,然后这里改成site.tags[page.title]

image

if site.tags[page.slug]就是访问某个标签下的post清单。

AI改BUG使用经验 #vibe_coding#

摘要

不要一来就使用agent,让AI开始改代码。先使用ask,定位问题在哪。

因为,Bug不一定需要很大的代码量,最重要的找到问题所在。

tag_generator.rb

提示词: 在这里,需要将标签的名称slugify;

结果:可以运行,但是|和中文被去掉了

提示词: 将|装换为-,保留中文

结果:中文保留了,但是|不见了

提示词: 现在处理完|不见了,需要将“|”替换成“-”

结果:满足预期

评价:在文件中,写函数的能力还是可以的

这个项目,生成的标签列表页“digital-mind-电子大脑”,显示“There are no posts in digital-mind-电子大脑.”,是什么问题?

能基本找到问题。但是agent直接改代码,感觉因为改了tag_generator.rb​后_tags_page​的文件需要先删除再运行jekyll serve​来创建,但AI没发现,导致_tags_page​文件没更新,Debug陷入了牛角尖(一直在看为什么写入文件不对)

评价:能够相对准确地找到问题在哪。

Git在一个分支上做了修改,但是还没有提交,能否在另外一个分支上提交 #git#

场景

我的博客项目,在SE_Road分支git pull了最新发布的内容,发现了博客tag系统的bug,然后直接在这个分支上做了很多调整,现在Bug调完了,我是否可以换一个分支专门提交博客框架上的修改。

解决方案

不需要。可以通过选择特定的文件,来创建一个commit只提交框架相关的提交;然后第二个commit再提交博客和标签页的修改。

# add 特定文件
git add _layouts/page_tag.html _plugins/tag_generator.rb _config.yml 

# 查看哪些文件staged
git status

# unstaged不属于框架文件的文件
git restore --staged _posts/

# 提交框架的修改 并与github上的bug编号对应
git commit -m "Slugify问题:「digital_mind|电子大脑」标签无法访问 fixes #51"

然后其他博客发布分支,用git rebase main​来更新框架文件(其实也同步了其他分支发布的博客),不过每个分支的文章应该是不冲突的,所以可以就用rebase

# jekyll