Plugin Discourse e configurazione Rails 6 config/initializers Domanda

Ora ha molto senso. Non ho riscontrato problemi perché, anche quando lavoravo sul nucleo di Discourse, facevo un riavvio del server invece di ricaricare il codice.

1 Mi Piace

Quello che ho fatto recentemente, non essendo ancora un esperto super come molti di voi nella creazione di app Rails, è stato pianificare quali variabili di configurazione dovrebbero essere ricaricate senza riavviare Rails e spostare quel codice nell’ApplicationController.

Sono certo che esistano modi migliori per farlo, ma dato che questa specifica implementazione Rails è un’app back-office e le prestazioni non sono 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

Sarò felice quando troverò un modo migliore per farlo!

Tuttavia, spostare questo codice fuori dagli inizializzatori di Rails significa che l’utente può modificare facilmente questa impostazione del sito, poiché ora è nel database utilizzando uno scaffold CRUD MVC di base.

Poiché la cache SQL in Rails non funziona al di fuori dell’ambito di un’azione, un giorno dovrò imparare come spostarla nella cache e assicurarmi che la cache venga cancellata quando il controller Rails elabora l’azione (ad esempio, salvare un nuovo valore nel controller delle impostazioni del sito, ecc.).

Comunque, questa app Rails del cliente (solo back-office) non è pensata per un uso ad alte prestazioni, quindi aggiungere la query all’ApplicationController funziona bene e mi evita di ripetere questo codice in ogni controller del progetto in cui è necessaria quell’impostazione del sito.

2 Mi Piace

Ciao @fzngagan, certamente non sono un “esperto di Ruby” e ho molta meno esperienza con Rails rispetto alla maggior parte degli sviluppatori di plugin per Discourse; ma detto questo: forse in futuro potresti cavartela con qualcosa di simile se hai bisogno di ricaricare i file nel tuo plugin senza riavviare l’applicazione in produzione (o in sviluppo):

after_initialize do

  # modifica quanto segue con il controller di tua scelta
  # oppure usa il controller dell'applicazione se necessario

  ApplicationController.class_eval do
    before_action :do_my_stuff

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

Questo ricaricherà i file come previsto.

Attualmente lo sto usando in un plugin nel modo seguente e funziona come previsto:

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

Sto attualmente utilizzando questo codice in un plugin su cui sto lavorando di tanto in tanto, che visualizza i nomi dei container analizzati da ENV["DATA_NAME"] e anche lo spazio su disco analizzato da alcuni codici di sistema utilizzando df e grep.

Nelle nostre viste di amministrazione:

Come già detto, non sono affatto un esperto di Ruby; ma questo metodo funziona per me.

Ho esaminato il codice del plugin in instance.rb e dopo diversi tentativi ed errori, ho deciso di optare per il codice class_eval sopra riportato; potrebbe non essere il modo preferito di fare le cose, ma funziona sicuramente per me.

Ad esempio, se ricarico la pagina dopo aver eliminato molti backup di Discourse, l’indicatore dello spazio su disco cambia come previsto.