2016-04-12 8 views
1

Ich versuche, meine App über Strike via Webhook erfolgreiche Gebühren aufzuzeichnen. Dies basiert auf Chris Oliver GoRails Diskussion auf Stripe Webhooks. Ich verwende den Koudoku-Edelstein, um die Stripe-Funktionalität zu erstellen. Beim Laden des JSON-Objekts in die Charges-Tabellen tritt ein Fehler auf.Stripe NoMethodError: undefinierte Methode `Gebühren 'für Nil: NilClass in der Rails-Konsole

Hier ist der Fehler, wenn ich versuche, aufzeichnen ein Ereignis eintritt:

RecordCharges.new.call(event) 
Subscription Load (0.3ms) SELECT "subscriptions".* FROM "subscriptions" WHERE "subscriptions"."stripe_id" = ? LIMIT 1 [["stripe_id", "cus_withheldforexample"]] 
NoMethodError: undefined method `charges' for nil:NilClass 

In meiner App haben Nutzer ein Abonnement. Abonnements haben viele Gebühren. Gebühren gehören Abonnements.

Hier ist das Schema:

create_table "charges", force: :cascade do |t| 
t.string "stripe_id" 
t.string "amount" 
t.string "card_last4" 
t.string "card_type" 
t.string "card_exp_month" 
t.string "card_exp_year" 
t.datetime "created_at",  null: false 
t.datetime "updated_at",  null: false 
t.integer "subscription_id" 
end 

create_table "subscriptions", force: :cascade do |t| 
t.string "stripe_id" 
t.integer "plan_id" 
t.string "last_four" 
t.integer "coupon_id" 
t.string "card_type" 
t.float "current_price" 
t.integer "user_id" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
end 

Meine Stripe.rb Datei

class RecordCharges 
def call(event) 
    charge = event.data.object 
    subscription = Subscription.find_by(stripe_id: charge.customer) 

    subscription.charges.create(
     stripe_id: charge.id, 
     amount: charge.amount, 
     card_last4: charge.source.last4, 
     card_type: charge.source.brand, 
     card_exp_month: charge.source.exp_month, 
     card_exp_year: charge.source.exp_year 
     ) 
end 
end 

StripeEvent.configure do |events| 
events.subscribe 'charge.succeeded', RecordCharges.new 
end 

Irgendwelche Vorschläge? Vielen Dank!

+1

'subscription' gibt nil zurück. Also würde ich es wahrscheinlich 'find_by!' Machen und einen 'ActiveRecord :: RecordNotFound' Fehler auslösen, um es zu retten. Hat die Ladung einen Kunden? –

Antwort

0

Subscription.find_by(stripe_id: charge.customer) kommt nil zurück. Entweder Ihre charge hat keine customer und/oder Sie haben keine Subscription von dieser stripe_id.

Wenn Sie eine find_by! tun, wird Ihre App einen entsprechenden Fehler auslösen und wenn Ihre App richtig eingerichtet ist, wird 404 in der Produktion.

+0

Ich verwendete ein Stripe-Ereignis, das einem Abonnement entsprach, das nicht mehr existierte. Ich hatte die Datenbank seit dem letzten Erstellen des Benutzers zurückgesetzt, mit dem ich dies versuchte. Nach dem Erstellen eines neuen Benutzers mit einem neuen Abonnement wurde das Ereignis erfolgreich in der Datenbank gespeichert. Vielen Dank! –

+0

Danke für die Hilfe! –