Ceci ressemble à un Bug, mais je ne sais pas ce qui se passe.
Un certain nombre d’utilisateurs reçoivent une erreur 500 en essayant de charger /s/user/subscriptions/ (lors de la visite de /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
Peut-être que je rate quelque chose, mais /s/<username>/subscriptions/ n’est pas une route dans le plugin, n’est-ce pas ?
Jusqu’à présent, lorsque je visite /my/billing/subscriptions localement et sur un site de production, il redirige correctement vers /u/<username>/billing/subscriptions et je n’obtiens pas d’erreur 500.
D’autres indices sur la façon dont je peux reproduire cela ?
Cela provient de ce point de terminaison. Et sur ce serveur, avec certains utilisateurs, j’obtiens une erreur 500 (j’aurais dû inclure une capture d’écran, je pense). Je pense que cela se produit depuis un certain temps ? Ils m’ont fait venir pour mettre à niveau, ce que j’ai fait, puis ils ont signalé cette erreur, mais il semble qu’ils espéraient que la mise à niveau allait la résoudre (au moins la mise à niveau ne l’a pas cassée ?).
Zéro. Mon hypothèse est que quelque chose s’est produit à un moment donné dans le passé et qu’il reçoit maintenant un nil de quelque part au lieu d’un tableau ? Mais j’ai regardé le code et je ne vois aucun endroit qui ne teste pas nil avant d’accéder à un tableau.
Je suppose que c’est uniquement pour ce site ? Vous ne voyez pas cela sur d’autres sites ? Oui, il y a un “bug” où nous ne devrions pas renvoyer un 500, mais il y a probablement des “mauvaises” données quelque part, comme un plan manquant ou quelque chose comme ça. Peut-être qu’il a été supprimé dans Stripe et jamais mis à jour dans la base de données du plugin.
Pouvez-vous exécuter ces commandes dans la console Rails pour m’aider à déboguer ?
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 # notez combien d'abonnements ils ont
subscription = subs.first # changez ceci et exécutez les lignes ci-dessous pour chaque abonnement
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
Je pense que soit plans, soit plan renverra nil, mais cela nous aidera à déterminer où se situe le problème. Pourriez-vous me dire combien d’abonnements ils ont et s’il manque des plans pour eux ?
Probablement, une correction de code que je ferai sera de ne renvoyer aucun abonnement pour ces utilisateurs en cas d’erreur, mais s’ils ont réellement un abonnement, cela ne résoudra pas le problème. Peut-être que je ferai en sorte qu’il renvoie une erreur disant quelque chose comme “un abonnement a été trouvé mais il y a une erreur lors du chargement des détails du plan, veuillez contacter un administrateur pour obtenir de l’aide”.
Il y a 100 plans (donc probablement plus que ça) - peut-être que c’est ça le problème ? (J’ai essayé avec limit: 1000 mais ça n’a rien changé ; je suppose que c’est une limite de l’API Stripe ?)
Donc peut-être que s’il y a plus de 100 plans, ça échoue ? Oh, et les utilisateurs pour lesquels ça ne plante pas, sont sur des plans qui font partie des 100 premiers.