이것은 #contribute:bug로 보이지만, 무슨 일이 일어나고 있는지 알 수 없습니다.
사용자 중 일부가 /s/user/subscriptions/를 로드하려고 할 때 500 에러를 겪고 있습니다. (/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
해당 엔드포인트에서 데이터를 가져옵니다. 그리고 이 서버에서는 일부 사용자의 경우 500 오류가 발생하고 있습니다(스크린샷을 포함했어야 했는데, 그렇게 생각하네요). 꽤 오래전부터 발생하고 있었던 것 같나요? 저를 불러서 업그레이드를 진행하게 해 주셨고, 저는 업그레이드를 수행했습니다. 그러자 이 오류가 보고되었는데, 업그레이드로 인해 해결되기를 기대했던 것 같습니다(최소한 업그레이드 때문에 깨진 것은 아닌 것 같고요?).
전혀 없습니다. 제 추측으로는 과거에 어딘가에서 무언가가 발생하여, 지금은 어딘가에서 배열 대신 nil을 가져오는 것이 아닌가 싶습니다. 하지만 코드를 살펴봤는데, 배열에 접근하기 전에 nil을 검사하지 않는 곳이 어디인지 보이지가 않습니다.
이것은 해당 사이트에서만 발생하는 문제인 것 같습니다. 다른 사이트에서는 이런 현상이 나타나지 않나요? 500 에러를 반환해서는 안 되는 "버그"가 있는 것은 맞지만, 플랜 누락과 같은 어딘가에 “잘못된” 데이터가 존재할 가능성이 큽니다. 아마도 Stripe에서 데이터가 삭제되었지만 플러그인 데이터베이스에서는 업데이트되지 않았을 수 있습니다.
디버깅을 돕기 위해 다음 rails console 명령어를 실행해 주시겠어요?
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을 반환할 것 같지만, 이렇게 하면 문제가 어디에 있는지 좁혀 나가는 데 도움이 될 것입니다. 사용자가 몇 개의 구독을 가지고 있는지, 그리고 누락된 플랜이 있는지 알려주시겠어요?
제가 만들 코드 수정 사항은 에러가 발생하면 해당 사용자의 구독을 반환하지 않는 것일 수 있지만, 실제로 구독이 있는 경우라면 이는 문제를 근본적으로 해결하지 못합니다. 아마도 "구독은 발견되었지만 플랜 세부 정보를 불러오는 중 오류가 발생했습니다. 관리자에게 문의해 주세요."와 같은 오류 메시지를 반환하도록 할 것입니다.