Plugins do Discourse e configuração/inicializadores do Rails 6: Pergunta

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.

1 curtida

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.

2 curtidas

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.