يحصل عدد من المستخدمين على خطأ 500 عند محاولة تحميل /s/user/subscriptions/ (عند زيارة /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
ربما فاتني شيء ما، ولكن /s/<username>/subscriptions/ ليس مسارًا في المكون الإضافي، أليس كذلك؟
حتى الآن، عندما أزور /my/billing/subscriptions محليًا وعلى موقع إنتاج، يتم إعادة التوجيه بشكل صحيح إلى /u/<username>/billing/subscriptions ولا أحصل على خطأ 500.
يتم سحبها من نقطة النهاية هذه. وعلى هذا الخادم، مع بعض المستخدمين، أحصل على خطأ 500 (كان يجب أن أرفق لقطة شاشة، أعتقد). أعتقد أن هذا يحدث منذ فترة؟ لقد قاموا بتعييني للترقية، وهو ما فعلته، ثم أبلغوا عن هذا الخطأ، ولكن يبدو أنهم كانوا يأملون في أن يؤدي الترقية إلى حله (على الأقل لم يؤد الترقية إلى تعطيله؟).
صفر. أفضل تخمين لدي هو أن شيئًا ما حدث في وقت ما في الماضي والآن يحصل على nil من مكان ما بدلاً من مصفوفة؟ لكنني نظرت إلى الكود ولا أرى أي مكان لا يختبر nil قبل الوصول إلى مصفوفة.
أفترض أن هذا الموقع فقط؟ لا تراه في مواقع أخرى؟ نعم، هناك “خلل” حيث لا ينبغي لنا إرجاع 500، ولكن من المحتمل أن تكون هناك بعض البيانات “السيئة” في مكان ما مثل خطة مفقودة أو شيء من هذا القبيل. ربما تم حذفه في Stripe ولم يتم تحديثه أبدًا في قاعدة بيانات المكون الإضافي.
هل يمكنك تشغيل أوامر وحدة تحكم Rails هذه لمساعدتي في تصحيح الأخطاء؟
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 # لاحظ عدد الاشتراكات لديهم
subscription = subs.first # قم بتغيير هذا وتشغيل الأسطر أدناه لكل اشتراك
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
أعتقد أن إما plans أو plan سترجع nil، لكن هذا سيساعدنا في تضييق نطاق المشكلة. هل يمكنك إخباري بعدد الاشتراكات لديهم وما إذا كانت هناك أي خطط مفقودة لهم؟
من المحتمل أن يكون إصلاح الكود الذي سأقوم به هو عدم إرجاع أي اشتراكات لهؤلاء المستخدمين إذا كان هناك خطأ، ولكن إذا كان لديهم اشتراك فعليًا، فهذا لا يحل المشكلة حقًا. ربما سأجعله يرجع خطأ يقول شيئًا مثل “تم العثور على اشتراك ولكن هناك خطأ في تحميل تفاصيل الخطة له، يرجى الاتصال بمسؤول للمساعدة”.
رائع. شكرًا!\n\nكان هناك اشتراك واحد.\n\nتصحيح واحد في الكود الخاص بك:\n\nsubs = ::Stripe::Subscription.list(customer: customer.stripe_customer_id, status: 'all')[:data]\n\n\nهناك 100 خطة (لذا ربما أكثر من ذلك)-- ربما هذه هي المشكلة؟ (لقد جربت مع limit: 1000 ولكن ذلك لم يغير شيئًا؛ أعتقد أن هذا حد لواجهة برمجة تطبيقات Stripe؟)\n\nلذا ربما إذا كان هناك أكثر من 100 خطة يفشل؟ أوه، والمستخدمون الذين لا يفشل لديهم، هم على خطط ضمن أول 100.\n\n\ndiscourse(prod)\u003e plan = plans[:data].find { |p| p[:id] == price_id }\ndiscourse(prod)\u003e\n=\u003e nil\n\n\nتعديل:\n\nنعم. إذا قمت بهذا:\n\n\n# الحصول على معرف العنصر الأخير\nlast_price_id = plans.data.last.id\n\n# الحصول على الـ 100 التالية\nnext_plans = ::Stripe::Price.list(\n expand: ['data.product'],\n limit: 100,\n starting_after: last_price_id\n)\n\nثم\n\ndiscourse(prod)\u003e next_plans[:data].find { |p| p[:id] == price_id }\n\nيجد ما يبحث عنه.\n\nتعديل مرة أخرى: next_plans.count == 8. لقد اقترحت أن يحذفوا 10 خطط.