重建用户操作时出现 NoMethodError

大家好,我最初将这个问题提交到了 Support 频道,但在多次于全新安装中复现后,我相当确定这是一个 bug。这个问题是在最新的 Discourse 发布版本之后才出现的。以下是复现步骤:

  1. 执行常规的 Discourse 安装和设置(我在 Ubuntu Server 18.04 LTS 和 Ubuntu Server 20.04 LTS 上安装时都遇到了相同的错误)

  2. 设置完成后,进入容器并运行 rake user_actions:rebuild,将会出现以下错误:

    # 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

我在其他帖子中看到有人建议遇到类似错误时运行 ./launcher rebuild app,但执行后我仍然遇到了 NoMethodError。

非常欢迎大家提供任何建议。提前感谢!

1 个赞

我也遇到了这个错误。正在运行 Ubuntu 19.10。

抱歉,此任务本不应再存在,它已损坏多年。

我已将其移除。

重建用户操作或许可行,但非常复杂,尤其是需要考虑 assign 和 solved 等插件。

4 个赞

感谢提供信息,@sam。我之前没意识到这一点。顺便一提,这个任务几天前(至少对我来说)还是能正常运行的,没有任何问题。在导入之后,我成功执行了该任务,它确实按预期重建了用户操作记录。

那么,与其运行这个任务,是否有更推荐的方式来重建这些数据(或者在导入期间将其存储在哪里),以便 Discourse 能正确利用这些数据?

例如,我已经成功导入了所有 Discourse 发布之前的帖子历史记录,并正确映射到 user_action 表中的所有字段。实现这一目标的关键似乎是运行上述的 rake 命令,因为执行后每个用户的点赞历史记录(如点赞最多、已给出的点赞、收到的点赞等)都显示得准确无误。如果上述 rake 命令将被移除,能否请您指点一下,在数据库中用户操作记录还需要存储在哪里,才能确保它们在个人资料和用户统计中正确显示?这些数据是否只是被汇总并作为整数保存到 user_stats 表中,还是还有其他存储位置?

谢谢!

我们的导入器通常提供了一个在迁移期间执行此操作的框架。我建议查看它们的源代码。

https://github.com/discourse/discourse/tree/master/script/import_scripts

4 个赞

本主题已在 4 天后自动关闭,不再接受新回复。