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
相关产品推荐
相关产品推荐

