新しいレビューキュー(2019)に関するフィードバック

おっしゃる通りです。レビューキューのソートエラーは、プラグインを削除した後にデータベースに Akismet のレビュー対象レコードが残っていることが原因で発生します。ここでは、2 つの解決策が考えられます:

  1. ユーザーがプラグインを完全に削除する前に、データベースからこれらの行を削除するための rake タスクを提供する。
  2. プラグインが無効化されている場合に、これらの行を除外するデフォルトのスコープを Reviewable クラスに適用する。

どうお考えですか?

「いいね!」 4

もう一点、キューイング中のトピックや投稿を編集する場合、エディタのプレビューで画像が表示されない(見えない)現象も確認されています。

「いいね!」 2

投稿が審査待ちの状態で発生しますか?それとも却下した後ですか?前述の通り、却下されたキューイング中の投稿のアップロードはシステムによって自動的に削除されます。

「いいね!」 3

はい、レビュー待ちの時にですね、@Roman さん、エディターのプレビューでは画像が見えないんです。

「いいね!」 2

プラグインのアンインストールは稀であり、デフォルトのスコープ設定の方がバグを引き起こす可能性が高いと思います。

rake タスクを追加し、README の「アンインストール」セクションに、古いレコードを削除するための実行手順を記載するのは妥当だと考えます。それを行いましょう!

「いいね!」 4

「投稿のキュー通知」を0、または2000000000に設定して無効にしてみましたが、それでも「x件のアイテムのレビューが必要」という通知が頻繁に届きます。:face_with_monocle:


「いいね!」 1

システムが送信しているのは、キューに保留中の項目があるためです。変更された設定はキューに登録された投稿のリマインダー用です。代わりに notify_about_flags_after を 0 に設定してください。

「いいね!」 6

このタスクは現在利用可能です。データベースからプラグイン関連のレコードをすべて削除するには、以下を実行してください:

bundle exec rake akismet_uninstall:delete_reviewables

プラグインがインストールされていることを確認し、README のアンインストールセクションをお読みください:

https://github.com/discourse/discourse-akismet#uninstallation

「いいね!」 7

@Roman さん、ありがとうございます。notify_about_flags_after を 0 に変更することで通知が止まったことを確認しました :smiley:

このための rake タスクを追加してくださり、本当に感謝しています。今日は交通量がピークになるのを避けて、後ほど Akismet を再インストールし、rake タスクを実行した後に、その結果をこの投稿で更新いたします。

「いいね!」 4

これについてご意見はありますか?@Roman @eviltrout

レビューキューに直接投稿が送られるユーザーは、トピックや投稿・返信の作成に関する多くのレート制限を回避できるようです。

回避可能なレート制限のオプション:
トピック作成のレート制限、新規ユーザーのトピック作成のレート制限、1 日あたりの最大トピック数、投稿作成のレート制限、新規ユーザーの投稿作成のレート制限、一意の投稿間の最小間隔、連続返信の最大数。

また、「no bump」プラグインによるトピックのバンプ防止も同様です: Discourse No Bump - #26

トピックと投稿をレビューキューに直接送るオプション:
「投稿承認数」(新規ユーザーが最初のトピックや投稿の承認を必要とする設定)および、カテゴリごとの個別オプションである「すべての新規トピックのモデレーターによる承認を要求する」、おそらく(新規トピックのオプションのみテスト済みですが)「すべての新規返信のモデレーターによる承認を要求する」も含まれます。

「いいね!」 1

はい、これは意図的な仕様です。投稿が審査され、問題ないと判断されれば、制限に関係なく公開されます。

「いいね!」 7

ああ、なるほど。ご説明ありがとうございます。参考までに、私の経験談を共有させていただきます。

制限が強制されていない場合、新規ユーザー(承認済み投稿数ベース)は、制限なし、あるいは極めて少ない制限でレビューキューに投稿を大量に投稿できてしまいます。一方、信頼のある既存アカウントはレート制限によって制限されています。ただし、カテゴリ設定で「すべてのトピックまたは返信を承認する」オプションが有効になっている場合は、信頼のある既存ユーザーも制限なし、あるいは極めて少ない制限となります。

すべての新規トピック、および新規ユーザーが作成した初期のトピック/投稿(レート制限がかかっている場合も含む)を承認するのは、かなり手間がかかりますが、実現不可能ではありません。しかし、ユーザーがレビューキューを埋め尽くすことができる状況では、私のケースではほぼ不可能に近い状態です。

とにかく、これが設計によるものであるというご clarification に心から感謝します。非常に役立ちました。戦略を見直し、トピックや投稿を直接レビューキューに送るオプションを無効化し、レビューキューは主にフラグ付きコンテンツのみに限定しようと思います。その後、レート制限のかかったライブ投稿を事後に moderation すれば、うまくいくでしょうし、ユーザーにとってもよりスムーズでテンポの良い体験になるはずです。

「いいね!」 1

So I went ahead and reinstalled Akismet and ran the rake task. My process was:

cd /var/discourse
./launcher enter app
bundle exec rake akismet_uninstall:delete_reviewables

I received an error unfortunately, tried running it a few times:

rake aborted!
ActiveRecord::NoDatabaseError: FATAL:  Peer authentication failed for user "discourse"
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/postgresql_adapter.rb:50:in `rescue in postgresql_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/postgresql_adapter.rb:33:in `postgresql_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:887:in `new_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:931:in `checkout_new_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:910:in `try_to_checkout_new_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:871:in `acquire_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:593:in `checkout'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:437:in `connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:1119:in `retrieve_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_handling.rb:221:in `retrieve_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_handling.rb:189:in `connection'
/var/www/discourse/lib/site_settings/db_provider.rb:61:in `table_exists?'
/var/www/discourse/lib/site_settings/db_provider.rb:16:in `all'
/var/www/discourse/lib/site_settings/defaults_provider.rb:29:in `db_all'
/var/www/discourse/lib/site_setting_extension.rb:287:in `block in refresh!'
/var/www/discourse/lib/site_setting_extension.rb:284:in `synchronize'
/var/www/discourse/lib/site_setting_extension.rb:284:in `refresh!'
/var/www/discourse/lib/site_setting_extension.rb:505:in `block in setup_methods'
/var/www/discourse/config/initializers/004-message_bus.rb:120:in `<main>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:318:in `block in load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:291:in `load_dependency'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:318:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:666:in `block in load_config_initializer'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/notifications.rb:182:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:665:in `load_config_initializer'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:625:in `block (2 levels) in <class:Engine>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:624:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:624:in `block in <class:Engine>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:32:in `instance_exec'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:32:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:50:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:50:in `tsort_each_child'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:60:in `run_initializers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/application.rb:363:in `initialize!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/config/environment.rb:7:in `<main>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/zeitwerk-2.3.0/lib/zeitwerk/kernel.rb:23:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:324:in `block in require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:291:in `load_dependency'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:324:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/application.rb:339:in `require_environment!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/application.rb:523:in `block in run_tasks_blocks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'

Caused by:
PG::ConnectionBad: FATAL:  Peer authentication failed for user "discourse"
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/pg-1.2.3/lib/pg.rb:58:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/pg-1.2.3/lib/pg.rb:58:in `new'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/pg-1.2.3/lib/pg.rb:58:in `connect'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/postgresql_adapter.rb:46:in `postgresql_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:887:in `new_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:931:in `checkout_new_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:910:in `try_to_checkout_new_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:871:in `acquire_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:593:in `checkout'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:437:in `connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:1119:in `retrieve_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_handling.rb:221:in `retrieve_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_handling.rb:189:in `connection'
/var/www/discourse/lib/site_settings/db_provider.rb:61:in `table_exists?'
/var/www/discourse/lib/site_settings/db_provider.rb:16:in `all'
/var/www/discourse/lib/site_settings/defaults_provider.rb:29:in `db_all'
/var/www/discourse/lib/site_setting_extension.rb:287:in `block in refresh!'
/var/www/discourse/lib/site_setting_extension.rb:284:in `synchronize'
/var/www/discourse/lib/site_setting_extension.rb:284:in `refresh!'
/var/www/discourse/lib/site_setting_extension.rb:505:in `block in setup_methods'
/var/www/discourse/config/initializers/004-message_bus.rb:120:in `<main>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:318:in `block in load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:291:in `load_dependency'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:318:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:666:in `block in load_config_initializer'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/notifications.rb:182:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:665:in `load_config_initializer'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:625:in `block (2 levels) in <class:Engine>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:624:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/engine.rb:624:in `block in <class:Engine>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:32:in `instance_exec'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:32:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:50:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:50:in `tsort_each_child'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/initializable.rb:60:in `run_initializers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/application.rb:363:in `initialize!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/config/environment.rb:7:in `<main>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/zeitwerk-2.3.0/lib/zeitwerk/kernel.rb:23:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:324:in `block in require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:291:in `load_dependency'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.3.1/lib/active_support/dependencies.rb:324:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/application.rb:339:in `require_environment!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.1/lib/rails/application.rb:523:in `block in run_tasks_blocks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => akismet_uninstall:delete_reviewables => environment
(See full trace by running task with --trace)
「いいね!」 1

タスクを実行する前に、su discourse を実行して discourse ユーザーに切り替えてみてください。

「いいね!」 4

@Roman さん、ありがとうございます!とても助かりました :slight_smile:

su discourse を実行してから rake タスクを実行してみましたが、問題なく動作しました :tada:

「作成日時(降順)」でのソートも現在正常に動作しています。

「いいね!」 3

最近、サイト設定で「招待のみ」を有効にしたところ、システムによって生成されたユーザーアカウントのレビューキューに「承認が必要」とマークされた項目が現れました。

奇妙なことに、これは4年前に作成され、複数の投稿がありTL2の権限を持つ既存のアカウントですが、最近では活動しておらず(最後の投稿は2年前)、今日ログインした後にレビューフラグが立てられました。

まだ「ユーザーの承認」は実行しておらず、項目はレビューキューに残っていますが、アカウントは有効化され、フォーラムを利用できる状態のようです(これは正常な動作です)。

「招待のみ」が設定されている場合、レビューキューは最近再アクティブ化されたアカウントを新規アカウントとして認識し、レビュー対象としてマークしているのでしょうか?

編集:この設定を有効にした数日前に作成された非常に新しいアカウントでも、同様のことが発生しました。

「いいね!」 1

以前、招待のみに切り替えた際に同様の現象を目にしたことがあります。特定の状況では、Discourseはユーザーが通常登録によってサイトにアクセスしたため、承認が必要だと判断します。そのトグルを変更すると、そのレコードに「承認済み」フラグが設定されていない状態になります。

「いいね!」 3

さらに調査した結果、これらのアカウント(合計 4 つ)に共通している点は、invite_only が設定された後に、forgot_password または直接 email_login のいずれかのメールログインパスを使用してログインしていたことのみです。

「いいね!」 2

Akismet によってフラグ付けされたレビュートピック/投稿に「停止」機能を追加する検討はなされましたか?当インスタンスではこの提案がなされました。理由は SSO 方式を採用しているため、メンバーを削除してもほとんど効果がないからです。メンバーはプライマリプロバイダーのアカウントで再ログインするだけで、即座にフォーラムにログインして活動を継続できてしまいます。一方、停止措置を講じると、新しいメールアドレスでプロバイダーに新規アカウントを作成する必要が生じるため、より手間がかかります。

これは少し奇妙なリクエストかもしれませんが、私のモデレーターが頻繁に質問する内容です。現在、彼らは手動でシステムを巡回してユーザーを停止させており、その作業は追加の負担となっていますが、ユーザーが結局のところ別のメールアドレスを捨てることを嫌がる以上、その価値はあります。

「いいね!」 6

多数の追加ボタンを追加するのではなく、ドロップダウンボタンにする必要があると思います。

「いいね!」 4