Agora faz muito sentido. Eu não tive problemas porque costumava reiniciar o servidor, mesmo trabalhando no núcleo do Discourse, em vez de recarregar o código.
O que fiz recentemente, ainda não sendo um super especialista como muitos de vocês na criação de aplicações Rails, foi planejar quais variáveis de configuração deveriam ser recarregadas sem reiniciar o Rails e mover esse código para o ApplicationController.
Tenho certeza de que existem maneiras melhores de fazer isso, mas como essa implementação específica do Rails é um aplicativo de back-office e o desempenho não é um 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
Ficarei feliz quando encontrar uma maneira melhor de fazer isso!
No entanto, mover isso para fora dos inicializadores do Rails significa que o usuário pode alterar essa configuração do site facilmente, pois agora ela está no banco de dados usando um scaffold básico de CRUD do Rails MVC.
Como o cache SQL no Rails não funciona fora do escopo de uma ação, um dia precisarei aprender a mover isso para o cache e garantir que o cache seja limpo quando o controlador do Rails processar a ação (por exemplo, salvar um novo valor no controlador de configurações do site, etc.).
De qualquer forma, este aplicativo cliente do Rails (apenas para back-office) não é para uso de alto desempenho, então adicionar a consulta ao controlador da aplicação funciona bem e me poupa de repetir esse código em cada controlador do projeto onde essa configuração do site é necessária.
Olá @fzngagan, certamente não sou um “rubyista” e tenho muito menos experiência com Rails do que a maioria dos desenvolvedores de plugins do Discourse; mas dito isso: talvez você possa se virar com algo assim no futuro, caso precise recarregar arquivos no seu plugin sem reiniciar o aplicativo em produção (ou desenvolvimento):
after_initialize do
# altere o seguinte para o controlador de sua escolha
# ou use o Application Controller se necessário
ApplicationController.class_eval do
before_action :do_my_stuff
def do_my_stuff
load File.open(FAIZAANS_FAV_FILE)
end
end
end
Isso recarregará os arquivos conforme o esperado.
Estou usando isso atualmente em um plugin da seguinte maneira, e funciona como esperado:
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
Estou usando esse código em um plugin no qual tenho trabalhado de vez em quando, que exibe os nomes dos containers, extraídos de ENV["DATA_NAME"], e também o espaço em disco, extraído de algum código do sistema usando df e grep.
Nas nossas visualizações de administração:
Como mencionado, não sou um Rubyista de forma alguma; mas esse método funciona para mim.
Analisei o código do plugin em instance.rb e, após várias tentativas e erros, decidi seguir com o código class_eval acima. Pode não ser a maneira preferida de fazer as coisas, mas certamente funciona para mim.
Por exemplo, se eu recarregar a página após excluir muitos backups do Discourse, o indicador de espaço em disco muda conforme o esperado.
