【问题标题】:How to access params hash in lib directory rails 6如何访问lib目录rails 6中的params hash
【发布时间】: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


【解决方案1】:

您可以在Kramdown::Document#new 中传递其他选项,因此只需执行Kramdown::Document.new(text, my_params: params) 之类的操作。然后你可以使用转换器的#options 方法来访问你的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2015-07-19
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多