Volevo solo dare un aggiornamento e ringraziare tutti coloro che hanno aiutato.
Con le ultime modifiche, il plugin ora funziona esattamente come intendevo! Assegna correttamente titoli diversi in base al gruppo primario e al livello di fiducia dell’utente.
Sto pubblicando di seguito il codice funzionante finale. Sembra corretto, ma dato che non sono uno sviluppatore, mi chiedevo se ci fossero aree di miglioramento o ottimizzazione che potrei aver trascurato.
app/jobs/scheduled/update-all-titles.rb
# frozen_string_literal: true
module ::Jobs
class AssignGroupBasedTitles < ::Jobs::Scheduled
every SiteSetting.update_title_frequency.hours
def execute(args)
return unless SiteSetting.add_title_by_group_trust_enabled
# Ottieni il valore dell'impostazione, che ora è una stringa JSON
rules_json_string = SiteSetting.group_based_title_rules
return if rules_json_string.blank?
begin
# Questa è la correzione più critica: analizza manualmente la stringa JSON in un array Ruby
rules = JSON.parse(rules_json_string)
rescue JSON::ParserError
# Se il formato JSON è errato, esci direttamente per evitare che il job fallisca
Rails.logger.error("Plugin Titoli Basati sui Gruppi: Impossibile analizzare group_based_title_rules JSON.")
return
end
return unless rules.is_a?(Array) && rules.present?
User.transaction do
rules.each do |rule|
group_id = rule["group_id"]
trust_level = rule["trust_level"]
title = rule["title"]
next if group_id.blank? || trust_level.blank? || title.blank?
User.where(primary_group_id: group_id, trust_level: trust_level)
.where.not(title: title)
.update_all(title: title)
end
end
end
end
end
config/settings.yml
plugins:
add_title_by_group_trust_enabled:
default: true
client: true
# Questo DEVE essere di tipo: objects. Questa è stata la fonte dell'errore.
group_based_title_rules:
type: objects
default: []
schema:
properties:
group_id:
type: integer
name: "Gruppo Utente"
component: "group-chooser"
trust_level:
type: integer
name: "Livello di Fiducia"
min: 1
max: 4
title:
type: string
name: "Titolo"
update_title_frequency:
default: 24
type: integer
plugin.rb
# frozen_string_literal: true
# name: add-title-by-group-trust-level
# about: Assegna titoli in base al gruppo primario e al livello di fiducia.
# version: 2.1.0
# authors: Your Name
enabled_site_setting :add_title_by_group_trust_enabled
after_initialize do
require_relative "./app/jobs/scheduled/update-all-titles.rb"
end