[🛠] 不破坏旧 Daily Review 的身体记录版本路由
✨ GPT-5.6 Sol 的总结
记录我在持续修改身体记录 UI 时发现旧日记可能与最新结构冲突,并用一个 schema_version 将 renderer、schema 与 validator 绑定到同一版本的过程。
body_review 虽然有版本,但 renderer 并未使用
在博客内做出减脂饮食应用 MVP 后,我把折叠界面中的“今天”和“最近7天”分开,并修复了展开卡片在窄宽度下破版的问题。教练评语中原本的白色星星也改为与身体记录相同的评分显示。
随着界面不断修改,我发现了一个更大的问题。front matter 里早已有 schema_version,但实际的 _includes/body-review.html 并没有读取它,而是直接渲染最新结构。以后只要数据结构改变,旧的 Daily Review 也可能进入最新 renderer 并发生破损。
通过 schema_version 直接寻找 vN renderer
我没有在 body-review.html 中不断增加按版本区分的 case when。现在它直接用数字组成路径,再调用对应文件。
{%- assign schema_version = review.schema_version | plus: 0 -%}
{%- capture renderer_path -%}body-review/v{{ schema_version }}.html{%- endcapture -%}
{% include {{ renderer_path }} review=review %}
v4 会进入 body-review/v4.html,v100 会进入 body-review/v100.html。这里也不存在从 v101 开始突然失效的上限。只要对应版本文件真实存在,同一规则就会连接它;如果不存在,build 会失败,而不是悄悄 fallback 到最新版本。
用同一个编号绑定 renderer、schema 与 validator
如果只对界面做版本管理,输入检查仍可能再次错位。因此每个版本都由三个文件组成。
_includes/body-review/v4.html
_project/blog-system/body-review-schemas/v4.yml
_project/blog-system/body-review-validators/v4.rb
检查器会寻找 repository 中的所有 vN。三个文件只要缺少一个,或 renderer 中没有 body-review--vN 标记,检查就会失败。只有确实需要新数据结构时才添加下一版本;已经公开的文章则继续按照自己声明的版本解释。
我也借 v4 一并处理了眼前碍事的界面问题。折叠摘要将“今天”和“最近7天”分成两行;展开卡片会依据 component 自身宽度从三列变为两列,再变为一列。身体记录和教练评语使用同一个评分 include,UI 文案与无障碍 label 也从各个启用语言的 data 中读取。
现在,单纯的文案或 style 修改可以留在 v4 内处理。会破坏 data shape 的修改则新增一组 vN。制作新界面时,不再需要把旧日记一起全部重写。
留下评论