我试着让Markdown和.erb玩得很好。我想使用high_voltage来呈现使用Redcarpet解析的标记页(或者普通的带有减价部分的.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文档,但据我所知,call方法是新方法的派生,它只需要一个参数,即文本。但是,当我试图仅在快速rails控制台会话中使用它时,它还需要两个参数。
当我从上面的代码中删除解析erb的要求时,一切都按预期工作,所以我不认为它与Redcarpet不工作有任何关系。
我使用的是Rails v6.0.0.rc1和Rubyv2.5.3p105
任何帮助都是非常感谢的。
编辑
进一步的研究使我找到了Rails 6.0ERB ActionView模板处理程序。这个处理程序的调用方法确实需要两个参数,模板和源。也就是说,在Rails 5.2.3,ERB Action View模板处理程序调用方法中只需要一个参数,即模板。
有人能指点我找出这方面的来源吗?没有我能找到的文件。
发布于 2019-06-25 21:11:43
在这种情况下,当调用处理程序时,call将通过ActionView将源传递给它。
您可以这样重写您的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中提取的,但现在它作为一个单独的参数传递。
发布于 2020-03-14 01:27:30
这种在Rails 6中使用ERB实现标记的方法对我很有用。感谢路易-米歇尔为我指明了正确的方向,包括电话中的两个参数。
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)https://stackoverflow.com/questions/56715152
复制相似问题