Discourse 插件和 Rails 6 config/initializers 问题

嘿 @fzngagan,我当然算不上是"Ruby 专家”,在 Rails 方面的经验也比大多数 Discourse 插件开发者少得多;但话说回来:如果你需要在不重启应用(无论是在生产环境还是开发环境)的情况下重载插件中的文件,未来或许可以尝试像下面这样的方法:

after_initialize do

  # 将以下内容更改为你选择的控制器
  # 或者,如果需要,也可以使用 Application 控制器

  ApplicationController.class_eval do
    before_action :do_my_stuff

    def do_my_stuff
      load File.open(FAIZAANS_FAV_FILE)
    end
  end
end

这将按预期重载文件。

我目前在一个插件中就是这样使用的,效果符合预期:

after_initialize do

  Admin::AdminController.class_eval do
    before_action :do_neo_plugin_info

    def do_neo_plugin_info
      load File.open(PLUGIN_LOGIC)
    end
  end
end

我目前在一个间歇性开发的插件中使用这段代码,它用于显示容器名称(从 ENV["DATA_NAME"] 解析)以及通过系统代码使用 df 和 grep 解析出的磁盘空间。

在我们的管理视图中:

如前所述,我绝非 Ruby 专家;但这个方法对我很有效。

我查看了 instance.rb 中的插件代码,在尝试了不同的方法并经历了一些错误后,我决定采用上面的 class_eval 代码。这可能不是最佳实践,但它确实对我有效。

例如,如果在删除大量 Discourse 备份后刷新页面,磁盘空间指示器会按预期发生变化。