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.
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.
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.
