Plugins de Discourse y pregunta de configuración de Rails 6 config/initializers

Ahora tiene mucho más sentido. No tuve problemas porque solía reiniciar el servidor incluso cuando trabajaba en el núcleo de Discourse, en lugar de recargar el código.

Lo que hice recientemente, aunque aún no soy un experto superado como muchos de ustedes en la creación de aplicaciones Rails, fue planificar qué variables de configuración deberían recargarse sin reiniciar Rails y mover ese código al ApplicationController.

Estoy seguro de que existen formas mejores de hacerlo, pero dado que esta implementación específica de Rails es una aplicación de back-office y el rendimiento no es un problema:

class ApplicationController < ActionController::Base

  before_action  :set_site_settings

  private

  def set_site_settings
    @use_custom_date_format = Sitesetting.where(name: "custom_date_format").pluck(:value).last
  end

end

Estaré encantado cuando encuentre una mejor manera de hacerlo.

Sin embargo, al sacar esto de los inicializadores de Rails, el usuario puede cambiar esta configuración del sitio fácilmente, ya que ahora está en la base de datos utilizando un scaffold básico de CRUD de Rails MVC.

Dado que la caché SQL en Rails no funciona fuera del alcance de una acción, algún día necesitaré aprender cómo mover esto a la caché y asegurarme de que la caché se limpie cuando el controlador de Rails procese la acción (por ejemplo, guardar un nuevo valor en el controlador de configuraciones del sitio, etc.).

De todos modos, esta aplicación de cliente Rails (solo para back-office) no está diseñada para un uso de alto rendimiento, por lo que agregar la consulta al controlador de aplicaciones funciona bien y me evita repetir este código en cada controlador del proyecto donde se requiera esa configuración del sitio.

Hola @fzngagan, definitivamente no soy un “rubyista” y tengo mucha menos experiencia con Rails que la mayoría de los desarrolladores de complementos de Discourse; pero dicho esto: quizás en el futuro puedas arreglártelas con algo como esto si necesitas recargar archivos en tu complemento sin reiniciar la aplicación en producción (o desarrollo):

after_initialize do

  # cambia lo siguiente por tu controlador de preferencia
  # o usa el controlador de la aplicación si lo necesitas

  ApplicationController.class_eval do
    before_action :do_my_stuff

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

Esto recargará los archivos como se espera.

Actualmente estoy usando esto en un complemento de la siguiente manera, y funciona como se espera:

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

Actualmente estoy usando este código en un complemento en el que he estado trabajando de vez en cuando, el cual muestra los nombres de los contenedores que se解析an de ENV["DATA_NAME"] y también el espacio en disco解析ado de algún código del sistema usando df y grep.

En nuestras vistas de administración:

Como mencioné, no soy un rubyista en absoluto; pero este método funciona para mí.

Revisé el código del complemento en instance.rb y después de varios intentos y errores, decidí optar por el código class_eval de arriba. Puede que no sea la forma preferida de hacerlo, pero definitivamente funciona para mí.

Por ejemplo, si recargo la página después de eliminar muchas copias de seguridad de Discourse, el indicador de espacio en disco cambia como se espera.