在 Rails 7.1 中使用 Markdown 中的 ERB 和 Redcarpet

问题描述 投票:0回答:1

我正在尝试在 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)

有人可以解释一下为什么会发生这种情况以及如何解决吗?

ruby-on-rails erb ruby-on-rails-7 redcarpet
1个回答
0
投票

自定义模板处理程序使用来自

ActionView::Template::Handlers::ERB
的编译输出。
输出是 String,但从 Rails 7.1 开始它是
ActionView::OutputBuffer
(https://github.com/rails/rails/commit/ee68644c284aa7512d06b4b5514b1236c1b63f55)。
提交消息描述了进行此更改的原因:

随着最近对 OutputBuffer 的更改,如果稍后连接缓冲区,则调用

to_s
的成本极其昂贵(如果缓冲区从不更改,那么它应该相对便宜,因为 Ruby 将共享内存)。

所以我们看到一个错误:

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
© www.soinside.com 2019 - 2024. All rights reserved.