我正在尝试让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中仅需要一个参数即模板。
有人可以指出我在这种情况下是什么意思吗?我找不到它的文档。
答案 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
中提取出来的,但现在它作为一个单独的参数传递。