6

我正在尝试让 Markdown 与 .erb 很好地配合使用。我想使用 high_voltage 来渲染用 Redcarpet 解析的 markdown 页面(或带有 markdown 部分的普通 .html.erb 文件),并且正在努力让它们一起工作。

目前,我有一个名为的初始化程序markdown_template_handler.rb,其中包含以下代码:

class MarkdownTemplateHandler
  def erb
    @erb ||= ActionView::Template.registered_template_handler(:erb)
  end

  def call(template)
    compiled_source = erb.call(template)
    markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)

    "#{markdown.render(compiled_source.source).inspect}.html_safe;"
  end
end

ActionView::Template.register_template_handler(:md, MarkdownTemplateHandler.new)

但是它在第 7 行失败,compiled_source = erb.call(template)错误代码显示“参数数量错误(给定 1,预期 2)”

我查看了ERB Ruby 文档,但据我了解,调用方法是新方法的派生方法,它只需要一个参数,即文本。但是,当我尝试仅在快速 Rails 控制台会话中使用它时,它还需要两个参数。

当我从上面的代码中删除解析 erb 的要求时,一切都按预期工作,所以我认为这与 Redcarpet 不工作没有任何关系。

我正在使用 Rails v6.0.0.rc1 & Ruby v2.5.3p105

任何帮助表示赞赏。

编辑

进一步的研究使我找到了Rails 6.0 ERB ActionView 模板处理程序。这个处理程序的调用方法确实需要两个参数,模板和源。也就是说,在Rails 5.2.3 中,ERB Action View 模板处理程序调用方法只需要一个参数,即模板。

有人可以指出我在这种情况下找出来源的方向吗?我找不到它的文档。


4

2 回答 2

6

在这种情况下,当调用处理程序时,源将被传递给callActionView。

你会像这样重写你的call函数:

def call(template, source)
  compiled_source = erb.call(template, source)
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)

  "#{markdown.render(compiled_source).inspect}.html_safe;"
end

在 Rails 6 之前,source值是从 中提取的 template.source,但现在作为单独的参数传递。

于 2019-06-25T21:11:43.227 回答
3

这种在 Rails 6 中使用 ERB 渲染 markdown 的方法对我来说效果很好。感谢 Louis-Michel 为我指明了正确的方向,包括调用中的两个参数。

require 'redcarpet'

class MarkdownTemplateHandler

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

  def 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, MarkdownTemplateHandler.new)
于 2020-03-14T01:27:30.513 回答