NoMethodError lors de la reconstruction des actions utilisateur

Bonjour à tous, j’avais initialement soumis ce message dans la catégorie Support, mais je suis assez convaincu qu’il s’agit désormais d’un bug, après l’avoir reproduit plusieurs fois sur des installations fraîches. Ce problème est apparu uniquement après la dernière version de Discourse. Voici les étapes pour reproduire le bug :

  1. Suivez l’installation et la configuration normales de Discourse (j’ai obtenu la même erreur lors de l’installation sur Ubuntu Server 18.04 LTS ainsi que sur Ubuntu Server 20.04 LTS).

  2. Une fois la configuration terminée, accédez au conteneur et exécutez rake user_actions:rebuild. Vous obtiendrez cette erreur :

    # rake user_actions:rebuild --trace
    ** Invoke user_actions:rebuild (first_time)
    ** Invoke environment (first_time)
    ** Execute environment
    ** Execute user_actions:rebuild
    rake aborted!
    NoMethodError: undefined method `log_topic' for UserActionManager:Class
    /var/www/discourse/lib/tasks/user_actions.rake:14:in `block (2 levels) in <top (required)>'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.2.2/lib/active_record/relation/delegation.rb:85:in `each'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.2.2/lib/active_record/relation/delegation.rb:85:in `each'
    /var/www/discourse/lib/tasks/user_actions.rake:14:in `block in <top (required)>'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `block in execute'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `each'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `execute'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
    /usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:188:in `invoke'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:160:in `invoke_task'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block (2 levels) in top_level'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `each'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block in top_level'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:125:in `run_with_threads'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:110:in `top_level'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:83:in `block in run'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:186:in `standard_exception_handling'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:80:in `run'
    bin/rake:13:in `<top (required)>'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
    /usr/local/bin/bundle:23:in `load'
    /usr/local/bin/bundle:23:in `<main>'
    Tasks: TOP => user_actions:rebuild

J’ai vu dans d’autres publications que certains suggéraient d’exécuter ./launcher rebuild app face à des erreurs similaires, mais après l’avoir fait, j’ai toujours obtenu l’erreur NoMethodError.

Toute suggestion serait grandement appréciée. Merci d’avance !

1 « J'aime »

Je vois aussi cette erreur. J’utilise Ubuntu 19.10.

Désolé, cette tâche ne devrait plus exister, elle est cassée depuis de nombreuses années.

Je l’ai supprimée.

La reconstruction des actions des utilisateurs pourrait être envisageable, mais c’est très complexe, surtout car il faut prendre en compte des plugins tels que assign et solved.

4 « J'aime »

Merci pour l’info, @sam. Je ne le savais pas. Pour info, la tâche a fonctionné il y a quelques jours (du moins pour moi) sans problème. Après une importation, j’ai pu l’exécuter avec succès et elle a bien reconstruit les actions des utilisateurs comme prévu.

Au lieu d’exécuter cette tâche, existe-t-il une méthode préférée pour reconstruire ces données (ou un endroit où les stocker initialement lors d’une importation) afin qu’elles soient correctement utilisées par Discourse ?

Par exemple, j’ai réussi à importer tout l’historique des publications antérieures à Discourse et à les mapper correctement vers tous les champs de la table user_action. La partie importante pour y parvenir semblait être l’exécution de la commande rake ci-dessus, car elle affichait ensuite un historique précis des « j’aime » pour chaque utilisateur (les plus aimés, les « j’aime » donnés, reçus, etc.). Si la commande rake ci-dessus sera supprimée, pourriez-vous m’indiquer la bonne direction pour savoir où, ailleurs dans la base de données, les actions des utilisateurs doivent être stockées afin qu’elles s’affichent correctement dans les profils et les statistiques des utilisateurs ? Est-ce simplement compressé et enregistré dans la table user_stats sous forme d’entiers, ou y a-t-il un autre endroit où certaines de ces données sont stockées ?

Merci !

Nos importateurs offrent généralement un cadre pour réaliser cela lors des migrations. Je vous recommande d’examiner leur code source.

discourse/script/import_scripts at main · discourse/discourse · GitHub

4 « J'aime »

Ce sujet a été automatiquement fermé après 4 jours. De nouvelles réponses ne sont plus autorisées.