【发布时间】:2020-01-22 03:36:22
【问题描述】:
在我的 rails 应用程序中,我使用 Kramdown 来解析 Markdown。我想在 HTML 转换器中扩展 convert_a 方法的功能。其中一部分涉及访问数据库,但它依赖于 URL 中的参数。因为我没有直接调用我正在覆盖的方法,所以我不能简单地将方法传递给params 哈希。有没有办法访问这个哈希,甚至只是在 lib 目录中的模块中获取当前 URL?
为了提供更多上下文,方法调用在此处的辅助方法中:
# in app/helpers/myhelper.rb
def to_html(text)
Kramdown::Document.new(text, parse_block_html: true).to_custom_html
end
这是我覆盖convert_a的文件:
# in lib/custom_html.rb
class CustomHtml < Kramdown::Converter::Html
def convert_a(el, indent)
# use params[:foo] to make query
format_as_span_html(el.type, el.attr, inner(el, indent))
end
end
编辑:
提供更多关于调用覆盖方法的上下文。我对 Kramdown 代码库不是很熟悉,但是似乎在调用 to_custom_html 时,会在 Kramdown.rb 内部运行以下代码:
output, warnings = Converter.const_get(name).convert(@root, @options)
随后在内部 kramdown 元素上调用 convert_#{el.type}。
【问题讨论】:
-
你能显示这个
CustomHtml类被使用的代码吗? -
Kramdown gem 在内部使用它。 Kramdown 具有由 HTML 转换器转换的文本的内部表示。我只是覆盖其中一种方法。我不知道它何时被准确调用我只知道它在 Kramdown 生命周期中的某个时刻
-
好吧,我可以给你两个选择。 #1是你做“硬方式”并修补整个方法链以传递你的参数数据。 #2 是一种 hacky 方式,您可以使用全局或线程变量之类的东西,并且根本不用担心传递参数。对于一个爱好项目,我会采用 hacky 的方式。不过,在生产中使用这种方法之前,您应该更深入地考虑它。
-
请问,您想有条件地实现什么行为?也许在转换发生后操作 HTML 会更容易,比如 Nokogiri
标签: ruby-on-rails ruby kramdown