You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails应用部署Heroku后Kramdown无法正常显示问题求助

解决Rails中kramdown在Heroku生产环境失效的问题

看起来你遇到的核心问题是:kramdown生成的HTML在Heroku生产环境被意外转义,原本应该渲染成代码块的内容变成了<这类HTML实体,而本地环境却能正常工作。我来帮你一步步排查解决:

1. 先修正HTML安全处理的顺序

你当前的调用是kramdown_to_html(subthema.content.html_safe),这个顺序搞反了!

  • 原始内容里的~~~标记不是合法HTML,先给它加html_safe会让Rails误以为这是安全的HTML内容,反而在kramdown渲染完成后,把生成的真实HTML当成普通文本进行转义。
  • 正确的做法是先让kramdown处理原始文本生成HTML,再把结果标记为安全:
    kramdown_to_html(subthema.content).html_safe
    

2. 确保本地与Heroku的Gem版本完全一致

版本不一致是生产环境常见的坑:

  • 检查Gemfile.lock是否已经提交到Git,Heroku会严格按照这个文件安装依赖,避免本地和生产环境的kramdown(以及依赖的高亮gem如coderay)版本差异。
  • 可以本地运行bundle lock --check确认没有版本冲突,然后重新提交Gemfile.lock并部署到Heroku。

3. 统一kramdown的渲染配置

本地和生产环境的kramdown配置可能不一致,导致渲染结果不同:

  • 建议在config/initializers/kramdown.rb里统一配置渲染规则,比如启用代码高亮:
    Kramdown::Document.set_default_options(
      syntax_highlighter: :coderay,
      syntax_highlighter_opts: {
        line_numbers: :table,
        css: :class
      }
    )
    
  • 同时确保你的kramdown_to_html方法使用这个统一配置,比如:
    def kramdown_to_html(content)
      Kramdown::Document.new(content).to_html
    end
    

4. 排查Heroku环境的额外转义因素

有些Heroku环境的配置或第三方gem可能会二次转义内容:

  • 检查是否使用了HTML压缩类gem(如htmlcompressor),这类gem可能会错误转义代码块里的HTML标签,需要配置它忽略带有特定类的元素(比如.highlighter-coderay)。
  • 在Heroku控制台验证渲染结果:运行heroku run rails console,手动执行kramdown_to_html("~~~ ruby\ndef what?\n 42\nend\n~~~"),看输出是原始HTML还是转义后的实体——如果是原始HTML,说明问题出在视图层的转义;如果是转义后的,那就是kramdown的渲染逻辑有问题。

最后验证

修改完后重新部署到Heroku,测试代码块的渲染效果,应该就能正常显示高亮的代码块了。

内容的提问来源于stack exchange,提问作者AlbertMunichMar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:30:16