Das sieht nach einem Bug aus, aber ich weiß nicht, was los ist.
Eine Reihe von Benutzern erhalten einen 500-Fehler, wenn sie versuchen, /s/user/subscriptions/ zu laden (beim Besuch von /my/billing/subscriptions.
NoMethodError (undefined method `[]' for nil) app/controllers/application_controller.rb:427:in `block in with_resolved_locale' app/controllers/application_controller.rb:427:in `with_resolved_locale' l
Vielleicht übersehe ich etwas, aber /s/<username>/subscriptions/ ist keine Route im Plugin, oder?
Bisher, wenn ich /my/billing/subscriptions lokal und auf einer Produktionsseite besuche, leitet es korrekt zu /u/<username>/billing/subscriptions weiter und ich erhalte keinen 500-Fehler.
Gibt es noch weitere Hinweise, wie ich dies reproduzieren kann?
Es wird von diesem Endpunkt abgerufen. Und auf diesem Server erhalte ich bei einigen Benutzern einen 500er-Fehler (ich hätte wohl einen Screenshot beifügen sollen). Ich glaube, das passiert schon eine Weile? Sie haben mich an Bord geholt, um ein Upgrade durchzuführen, was ich getan habe, und dann meldeten sie diesen Fehler, aber es scheint, dass sie hofften, dass das Upgrade ihn beheben würde (zumindest hat das Upgrade ihn nicht kaputt gemacht?).
Null. Meine beste Vermutung ist, dass irgendwann in der Vergangenheit etwas passiert ist und jetzt irgendwo ein nil statt eines Arrays zurückgegeben wird? Aber ich habe mir den Code angesehen und sehe keine Stelle, an der nicht auf nil geprüft wird, bevor auf ein Array zugegriffen wird.
Ich gehe davon aus, dass dies nur für diese eine Website gilt? Sie sehen dies nicht auf anderen Websites? Ja, es gibt einen “Bug”, bei dem wir keine 500 zurückgeben sollten, aber es gibt wahrscheinlich einige “schlechte” Daten irgendwo, wie z. B. einen fehlenden Plan oder so etwas. Vielleicht wurde er in Stripe entfernt und nie in der Plugin-Datenbank aktualisiert.
Können Sie diese Rails-Konsolenbefehle ausführen, um mir bei der Fehlersuche zu helfen?
Stripe.api_key = SiteSetting.discourse_subscriptions_secret_key
user = User.find_by(username: 'xxx')
customer = DiscourseSubscriptions::Customer.find_by(user_id: user.id)
subs = ::Stripe::Subscription.list(customer: stripe_customer_id, status: 'all')[:data]
subs.count # wie viele Abonnements sie haben
subscription = subs.first # ändern Sie dies und führen Sie die folgenden Zeilen für jedes Abo aus
price_id = subscription[:items][:data].first[:price][:id]
plans = ::Stripe::Price.list(expand: ['data.product'], limit: 100)
plan = plans[:data].find { |p| p[:id] == price_id }
plan
Ich denke, entweder plans oder plan wird nil zurückgeben, aber das wird uns helfen, einzugrenzen, wo das Problem liegt. Könnten Sie mir bitte mitteilen, wie viele Abonnements sie haben und ob für sie fehlende Pläne vorhanden sind?
Wahrscheinlich werde ich eine Codekorrektur vornehmen, die darin besteht, für diese Benutzer keine Abonnements zurückzugeben, wenn ein Fehler auftritt, aber wenn sie tatsächlich ein Abonnement haben, löst dies das Problem nicht wirklich. Vielleicht gebe ich eine Fehlermeldung zurück, die besagt, dass ein Abonnement gefunden wurde, aber beim Laden der Plan-Details dafür ein Fehler aufgetreten ist. Bitte wenden Sie sich für Hilfe an einen Administrator.
Es gibt 100 Pläne (also wahrscheinlich mehr) – vielleicht ist das das Problem? (Ich habe es mit limit: 1000 versucht, aber das hat nichts geändert; ich schätze, das ist ein Stripe API-Limit?)
Also schlägt es vielleicht fehl, wenn es mehr als 100 Pläne gibt? Oh, und die Benutzer, bei denen es nicht fehlschlägt, haben Pläne, die unter den ersten 100 sind.
# Holen Sie sich die ID des letzten Elements
last_price_id = plans.data.last.id
# Holen Sie sich die nächsten 100
next_plans = ::Stripe::Price.list(
expand: ['data.product'],
limit: 100,
starting_after: last_price_id
)