在带有Redcarpet的Markdown中使用ERB

时间:2019-06-22 11:38:15

标签: ruby-on-rails erb redcarpet ruby-on-rails-6 high-voltage

我正在尝试让Markdown与.erb配合使用。我想使用high_voltage渲染Markdown页面(或带有markdown部分的普通.html.erb文件),这些页面已被Redcarpet解析,并且正在努力使其全部协同工作。

此刻,我有一个名为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 documentation,但据我了解,call方法是新方法的派生类,它仅需要1个参数,即文本。但是,当我尝试在快速Rails控制台会话中使用它时,它也需要两个参数。

当我从上述代码中删除了解析erb的要求时,一切都按预期进行,因此我认为这与Redcarpet无法正常工作无关。

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

感谢您的帮助。

修改

进一步的研究使我发现Rails 6.0 ERB ActionView template handler.的处理程序的调用方法确实需要两个参数,即模板和源。也就是说,在Rails 5.2.3, the ERB Action View template handler call method中仅需要一个参数即模板。

有人可以指出我在这种情况下是什么意思吗?我找不到它的文档。


2 个答案:

答案 0 :(得分:2)

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

href

答案 1 :(得分:0)

在这种情况下,调用处理程序时,ActionView会将源传递给call

您将像这样重写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中提取出来的,但现在它作为一个单独的参数传递。