カテゴリシリアライザーの変更が 2.4.0 で異なる動作を示しています

Release v2.4.0.beta2 · discourse/discourse · GitHub へのアップグレード後、当社のほぼすべてのプラグイン(トピックリストのプレビュー、イベント、場所、評価など)で、add_to_serializer メソッドを plugin.rb 内で使用する際に問題が発生しています。

従来の使用例は以下の形式でした:

add_to_serializer(:serializer, property) { value }

これは本番環境ではもはや機能しませんが、開発環境ではまだ動作します。

当初、これはプラグインの有効化処理の仕組みに関連しているのではないかと考えました。add_to_serializer_include? メソッドが enabled? ステートを使用するためです。

if define_include_method
   # プラグインが無効化されている場合はシリアライズメソッドを含めない
  klass.public_send(:define_method, "include_#{attr}?") { plugin.enabled? }
end

しかし、enabled_site_setting システムを使用しても問題は解決しません。さらに、enabled? はとにかくデフォルトで true のままのようです。

def enabled?
  @enabled_site_setting ? SiteSetting.get(@enabled_site_setting) : true
end

即座の問題を解決するため、プラグインのデータシリアライズ方法を変更しましたが、可能であれば根本原因を突き止めたいと考えています。何か心当たりはありますか?

cc @merefield, @fzngagan

これは非常に不自然です。私たちはこれを投票で使っており、明らかに壊れてはいません。考えられるのは、ベータ版では壊れていたが、マスターブランチで修正されたということでしょうか?「tests-passed」で試して、動作するか確認してもらえますか?

本日、さらにテストを行います。ポールの使用法は少し異なり、_include? メソッドには常に第 3 引数として false が指定されます。include? メソッドが問題の原因ではないかと疑っています。

add_to_serializer(:post, :polls_votes, false)

この問題は、カテゴリシリアライザの変更固有のようです。

https://staging.discourse.angusmcleod.com.au には、「test-add-to-serializer」という 1 つのプラグインがインストールされています。

plugin.rb をご覧いただくと、複数のシリアライザ変更が行われていることがわかります。

カテゴリ以外のシリアライザへの変更は機能しているようですが、basic_category シリアライザへの変更は開発環境でのみ機能しています。

以下の URL では、テストカテゴリのプロパティが見つかりません。

https://staging.discourse.angusmcleod.com.au/categories.json

または

https://staging.discourse.angusmcleod.com.au/c/records-musicians.json

しかし、他のテストプロパティは以下の URL で確認できます。

https://staging.discourse.angusmcleod.com.au/t/this-is-a-title-of-a-topic/42.json

または

https://staging.discourse.angusmcleod.com.au/latest.json

したがって、この問題は add_to_serializer メソッドそのものではなく、basic_category シリアライザの変更に関するものと思われます。

@j.jaffeux @dan こんにちは :), 上記で指摘した同じ問題に対処するために、discourse-voting で最近いくつかの作業を行われたようですね。

basic_category_serializer にプロパティを追加するだけではもう不十分になった理由をご存知ですか?

これにより tests-passed に影響が出ていることを確認しました。

Dan は離脱しましたが、本質的にはカテゴリを異なる量のデータでシリアライズする 3 つの異なる場所があります。ここで、推論を難しくしているミックスインを排除できるかどうかを確認します。

修正し、安定版とベータ版にもバックポートしました。

Dan が正しく継承構造を設定してくれましたが、非常に長期間存在していたコアのバグがあったのです。

@sam さん、ありがとうございます。とても助かりました。

ご報告と追いかけ、ありがとうございます。特定するのは非常に難しかったです。これを解決するために、Rails の内部を調べて時間を費やしました。

今後この問題が再発しないよう、どのように保証しているか気になる場合は、新しいテストもぜひご覧ください。

迅速な修正をありがとうございます、@sam

@angus、この修正に伴う最近の変更を適用せずに、私たちのプラグインは正常に動作しますか?