Skip to content

fix: NoMethodError in stripe - #93

Open
alexshapalov wants to merge 1 commit into
mainfrom
ai-fix/undefined-method-dig-stripe-invoice
Open

fix: NoMethodError in stripe#93
alexshapalov wants to merge 1 commit into
mainfrom
ai-fix/undefined-method-dig-stripe-invoice

Conversation

@alexshapalov

Copy link
Copy Markdown
Contributor

🐛 Bug Fix: NoMethodError

Issue ID: #378
Controller: WebhooksController#stripe
Occurrences: 8 times
First seen: 2025-12-27 19:39
Last seen: 2026-01-26 18:36

🔍 Root Cause Analysis

Analysis pending. Please review the stack trace below.

🔧 Suggested Fix

Manual review required. See error context below.

📋 Error Details

Error Message:

undefined method `dig' for #<Stripe::Invoice:0x51ab8 id=in_1Si0wuQ7xtE658H3MyHj5wfA> JSON: {
  "id": "in_1Si0wuQ7xtE658H3MyHj5wfA",
  "object": "invoice",
  "account_country": "US",
  "account_name": "ActiveRabbit",
  "account_tax_ids": null,
  "amount_due": 2900,
  "amount_overpaid": 0,
  "amount_paid": 2900,
  "amount_remaining": 0,
  "amount_shipping": 0,
  "application": null,
  "attempt_count": 1,
  "attempted": true,
  "auto_advance": false,
  "automatic_tax": {"disabled_reason":null,"enabled":false,"liability":null,"provider":null,"status":null},
  "automatically_finalizes_at": null,
  "billing_reason": "subscription_cycle",
  "collection_method": "charge_automatically",
  "created": 1766616872,
  "currency": "usd",
  "custom_fields": null,
  "customer": "cus_TU6pSiVIN2FfU3",
  "customer_account": null,
  "customer_address": null,
  "customer_email": "shapalov@gmail.com",
  "customer_name": null,
  "customer_phone": null,
  "customer_shipping": null,
  "customer_tax_exempt": "none",
  "customer_tax_ids": [],
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [],
  "description": null,
  "discounts": [],
  "due_date": null,
  "effective_at": 1766620512,
  "ending_balance": 0,
  "footer": null,
  "from_invoice": null,
  "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1SVPfpQ7xtE658H3/live_YWNjdF8xU1ZQZnBRN3h0RTY1OEgzLF9UZkxlR1NLTHBzdU81VUNqZ2F6cVd6Q01oTkp2V3ljLDE1NzE2MTMxOQ02000X2eqJMr?s=ap",
  "invoice_pdf": "https://pay.stripe.com/invoice/acct_1SVPfpQ7xtE658H3/live_YWNjdF8xU1ZQZnBRN3h0RTY1OEgzLF9UZkxlR1NLTHBzdU81VUNqZ2F6cVd6Q01oTkp2V3ljLDE1NzE2MTMxOQ02000X2eqJMr/pdf?s=ap",
  "issuer": {"type":"self"},
  "last_finalization_error": null,
  "latest_revision": null,
  "lines": {"object":"list","data":[{"id":"il_1Si0wuQ7xtE658H3purV07Sz","object":"line_item","amount":2900,"currency":"usd","description":"1 × Team (at $29.00 / month)","discount_amounts":[],"discountable":true,"discounts":[],"invoice":"in_1Si0wuQ7xtE658H3MyHj5wfA","livemode":true,"metadata":{"interval":"month","plan":"team","account_id":"2"},"parent":{"invoice_item_details":null,"subscription_item_details":{"invoice_item":null,"proration":false,"proration_details":{"credited_items":null},"subscription":"sub_1SX8eJQ7xtE658H3UctndZVw","subscription_item":"si_TU6sMd13uDgqvj"},"type":"subscription_item_details"},"period":{"end":1769295263,"start":1766616863},"pretax_credit_amounts":[],"pricing":{"price_details":{"price":"price_1SWVPoQ7xtE658H33go2RPJM","product":"prod_TTSKnFY2iwDqnQ"},"type":"price_details","unit_amount_decimal":"2900"},"quantity":1,"subtotal":2900,"taxes":[]}],"has_more":false,"total_count":1,"url":"/v1/invoices/in_1Si0wuQ7xtE658H3MyHj5wfA/lines"},
  "livemode": true,
  "metadata": {},
  "next_payment_attempt": null,
  "number": "3FDMCIBB-0002",
  "on_behalf_of": null,
  "parent": {"quote_details":null,"subscription_details":{"metadata":{"interval":"month","plan":"team","account_id":"2"},"subscription":"sub_1SX8eJQ7xtE658H3UctndZVw"},"type":"subscription_details"},
  "payment_settings": {"default_mandate":null,"payment_method_options":{"acss_debit":null,"bancontact":null,"card":{"request_three_d_secure":"automatic"},"customer_balance":null,"konbini":null,"payto":null,"sepa_debit":null,"us_bank_account":null},"payment_method_types":null},
  "period_end": 1766616863,
  "period_start": 1764024863,
  "post_payment_credit_notes_amount": 0,
  "pre_payment_credit_notes_amount": 0,
  "receipt_number": null,
  "rendering": null,
  "shipping_cost": null,
  "shipping_details": null,
  "starting_balance": 0,
  "statement_descriptor": null,
  "status": "paid",
  "status_transitions": {"finalized_at":1766620512,"marked_uncollectible_at":null,"paid_at":1766620512,"voided_at":null},
  "subtotal": 2900,
  "subtotal_excluding_tax": 2900,
  "test_clock": null,
  "total": 2900,
  "total_discount_amounts": [],
  "total_excluding_tax": 2900,
  "total_pretax_credit_amounts": [],
  "total_taxes": [],
  "webhooks_delivered_at": 1766616874
}

Stack Trace (top frames):

["/usr/local/bundle/ruby/3.2.0/gems/stripe-13.0.0/lib/stripe/stripe_object.rb:403:in `method_missing'", "/rails/app/services/stripe_event_handler.rb:179:in `handle_payment_succeeded'", "/rails/app/services/stripe_event_handler.rb:15:in `call'", "/rails/app/controllers/webhooks_controller.rb:20:in `block in stripe'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:626:in `block in within_new_transaction'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:623:in `within_new_transaction'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:367:in `within_new_transaction'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:359:in `transaction'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/transactions.rb:233:in `block in transaction'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:418:in `with_connection'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/connection_handling.rb:310:in `with_connection'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/transactions.rb:232:in `transaction'", "/rails/app/controllers/webhooks_controller.rb:18:in `stripe'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_controller/metal/basic_implicit_render.rb:8:in `send_action'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/abstract_controller/base.rb:226:in `process_action'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_controller/metal/rendering.rb:193:in `process_action'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/abstract_controller/callbacks.rb:261:in `block in process_action'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/callbacks.rb:120:in `block in run_callbacks'", "/usr/local/bundle/ruby/3.2.0/gems/turbo-rails-2.0.16/lib/turbo-rails.rb:24:in `with_request_id'", "/usr/local/bundle/ruby/3.2.0/gems/turbo-rails-2.0.16/app/controllers/concerns/turbo/request_id_tracking.rb:10:in `turbo_tracking_request_id'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/callbacks.rb:129:in `block in run_callbacks'", "/usr/local/bundle/ruby/3.2.0/gems/actiontext-8.0.2.1/lib/action_text/rendering.rb:25:in `with_renderer'", "/usr/local/bundle/ruby/3.2.0/gems/actiontext-8.0.2.1/lib/action_text/engine.rb:71:in `block (4 levels) in <class:Engine>'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/callbacks.rb:129:in `instance_exec'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/callbacks.rb:129:in `block in run_callbacks'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/callbacks.rb:140:in `run_callbacks'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/abstract_controller/callbacks.rb:260:in `process_action'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_controller/metal/rescue.rb:27:in `process_action'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_controller/metal/instrumentation.rb:76:in `block in process_action'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/notifications.rb:210:in `block in instrument'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/notifications/instrumenter.rb:58:in `instrument'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/notifications.rb:210:in `instrument'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_controller/metal/instrumentation.rb:75:in `process_action'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_controller/metal/params_wrapper.rb:259:in `process_action'", "/usr/local/bundle/ruby/3.2.0/gems/activerecord-8.0.2.1/lib/active_record/railties/controller_runtime.rb:39:in `process_action'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/abstract_controller/base.rb:163:in `process'", "/usr/local/bundle/ruby/3.2.0/gems/actionview-8.0.2.1/lib/action_view/rendering.rb:40:in `process'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_controller/metal.rb:252:in `dispatch'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_controller/metal.rb:335:in `dispatch'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/routing/route_set.rb:67:in `dispatch'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/routing/route_set.rb:50:in `serve'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/journey/router.rb:53:in `block in serve'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/journey/router.rb:133:in `block in find_routes'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/journey/router.rb:126:in `each'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/journey/router.rb:126:in `find_routes'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/journey/router.rb:34:in `serve'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/routing/route_set.rb:908:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/omniauth-2.1.4/lib/omniauth/strategy.rb:202:in `call!'", "/usr/local/bundle/ruby/3.2.0/gems/omniauth-2.1.4/lib/omniauth/strategy.rb:169:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/omniauth-2.1.4/lib/omniauth/strategy.rb:202:in `call!'", "/usr/local/bundle/ruby/3.2.0/gems/omniauth-2.1.4/lib/omniauth/strategy.rb:169:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-attack-6.7.0/lib/rack/attack.rb:103:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-attack-6.7.0/lib/rack/attack.rb:127:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/warden-1.2.9/lib/warden/manager.rb:36:in `block in call'", "/usr/local/bundle/ruby/3.2.0/gems/warden-1.2.9/lib/warden/manager.rb:34:in `catch'", "/usr/local/bundle/ruby/3.2.0/gems/warden-1.2.9/lib/warden/manager.rb:34:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb:20:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb:29:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb:44:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb:15:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/http/permissions_policy.rb:38:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/http/content_security_policy.rb:38:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-session-2.1.1/lib/rack/session/abstract/id.rb:274:in `context'", "/usr/local/bundle/ruby/3.2.0/gems/rack-session-2.1.1/lib/rack/session/abstract/id.rb:268:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/cookies.rb:706:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/callbacks.rb:31:in `block in call'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/callbacks.rb:100:in `run_callbacks'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/callbacks.rb:30:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/activerabbit-ai-0.6.1/lib/active_rabbit/middleware/error_capture_middleware.rb:11:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/debug_exceptions.rb:31:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/show_exceptions.rb:32:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/railties-8.0.2.1/lib/rails/rack/logger.rb:41:in `call_app'", "/usr/local/bundle/ruby/3.2.0/gems/railties-8.0.2.1/lib/rails/rack/logger.rb:29:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/railties-8.0.2.1/lib/rails/rack/silence_request.rb:28:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/remote_ip.rb:96:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/request_id.rb:34:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb:28:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb:24:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/activesupport-8.0.2.1/lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/executor.rb:16:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/static.rb:27:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb:114:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/actionpack-8.0.2.1/lib/action_dispatch/middleware/assume_ssl.rb:24:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/railties-8.0.2.1/lib/rails/engine.rb:535:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb:279:in `call'", "/usr/local/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb:99:in `block in handle_request'", "/usr/local/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb:390:in `with_force_shutdown'", "/usr/local/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb:98:in `handle_request'", "/usr/local/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb:472:in `process_client'", "/usr/local/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb:254:in `block in run'", "/usr/local/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb:167:in `block in spawn_thread'"]

Request Context:

  • Method: POST
  • Path: /webhooks/stripe

✅ Checklist

  • Code fix implemented
  • Tests added/updated
  • Error scenario manually verified
  • No regressions introduced

Generated by ActiveRabbit AI

fix: app/services/stripe_event_handler.rb
@alexshapalov
alexshapalov marked this pull request as ready for review January 27, 2026 23:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant