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

Rails 7.1中用Redcarpet实现Markdown嵌套ERB报错及解决咨询

Rails 7.1.1 + Redcarpet 3.6.0 报错修复方案

报错原因

Rails 7.1.x 版本中,ERB模板处理器返回的是ActionView::OutputBuffer对象,而非字符串类型。你的代码直接将该对象传入Redcarpet的render方法,但该方法仅接受字符串参数,因此触发类型不匹配错误。

修复方法

修改/config/initializers/markdown_handler.rb中的代码,将ERB编译后的输出转换为字符串后再传递给Redcarpet:

简洁修复版

module MarkdownHandler
  def self.erb
    @erb ||= ActionView::Template.registered_template_handler(:erb)
  end

  def self.call(template, source)
    compiled_source = erb.call(template, source)
    "Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render(begin;#{compiled_source};end.to_s).html_safe"
  end
end

ActionView::Template.register_template_handler :md, MarkdownHandler

清晰易读版

module MarkdownHandler
  def self.erb
    @erb ||= ActionView::Template.registered_template_handler(:erb)
  end

  def self.call(template, source)
    compiled_source = erb.call(template, source)
    <<~CODE
      erb_output = begin; #{compiled_source}; end
      Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render(erb_output.to_s).html_safe
    CODE
  end
end

ActionView::Template.register_template_handler :md, MarkdownHandler

关键说明

  • to_s方法可将ActionView::OutputBuffer对象转换为标准字符串,满足Redcarpet对参数类型的要求。
  • 清晰易读版通过先将ERB输出赋值给变量再转换类型,更便于后续调试和功能扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:47:39