我正在尝试在 Rails 7.1.1 应用程序中添加 Markdown 支持。
Redcarpet gem 版本是 3.6.0.
我遵循这个问题的建议:
在 Markdown 中使用 ERB 与 Redcarpet
我当前的代码(在
/config/initializers/markdown_handler.rb
中)是:
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).html_safe"
end
end
ActionView::Template.register_template_handler :md, MarkdownHandler
我收到一个错误:
ActionView::Template::Error: wrong argument type ActionView::OutputBuffer (expected String)
有人可以解释一下为什么会发生这种情况以及如何解决吗?
自定义模板处理程序使用来自
ActionView::Template::Handlers::ERB
的编译输出。ActionView::OutputBuffer
(https://github.com/rails/rails/commit/ee68644c284aa7512d06b4b5514b1236c1b63f55)。随着最近对 OutputBuffer 的更改,如果稍后连接缓冲区,则调用
的成本极其昂贵(如果缓冲区从不更改,那么它应该相对便宜,因为 Ruby 将共享内存)。to_s
所以我们看到一个错误:
ActionView::Template::Error: wrong argument type ActionView::OutputBuffer (expected String)
要修复它,我们可以简单地转换为字符串:
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