Stripe ve Ruby on Rails 3.2 ile küçük bir kavram kanıtı yapıyorum. Şimdiye kadar bir RoR uygulamasında Stripe'u nasıl uygulayacağına dair Railscast'i izledim ve gerçekten iyi çalışıyor.Şerit istisnalarının nerede ve nasıl yapılır?
Uygulamamı RailsCast #288 Billing with Stripe izleyerek oluşturdum. Artık kullanıcılarım kredi kartlarını ekleyebilir ve düzenleyebilir, hatta derslere kaydolabilir ve kredi kartlarını tamamlandıktan sonra faturalandırabilirler.
Şimdi Stripe'in sayısız test credit cards ile test ediyorum ve yükseltildiğinde çok fazla özel durum yakalamak istiyorum.
class Registration < ActiveRecord::Base
belongs_to :user
belongs_to :session
attr_accessible :session_id, :user_id, :session, :user, :stripe_payment_id
validates :user_id, :uniqueness => {:scope => :session_id}
def save_with_payment(user, stripe_card_token)
if valid?
if user.stripe_customer_id.present?
charge = Stripe::Charge.create(
:customer => user.stripe_customer_id,
:amount => self.session.price.to_i * 100,
:description => "Registration for #{self.session.name} (Id:#{self.session.id})",
:currency => 'cad'
)
else
customer = Stripe::Customer.create(
:email => user.email,
:card => stripe_card_token,
:description => user.name
)
charge = Stripe::Charge.create(
:customer => customer.id,
:amount => self.session.price.to_i * 100,
:description => "Registration for #{self.session.name} (Id:#{self.session.id})",
:currency => 'cad'
)
user.update_attribute(:stripe_customer_id, customer.id)
end
self.stripe_payment_id = charge.id
save!
end
rescue Stripe::CardError => e
body = e.json_body
err = body[:error]
logger.debug "Status is: #{e.http_status}"
logger.debug "Type is: #{err[:type]}"
logger.debug "Code is: #{err[:code]}"
logger.debug "Param is: #{err[:param]}"
logger.debug "Message is: #{err[:message]}"
rescue Stripe::InvalidRequestError => e
# Invalid parameters were supplied to Stripe's API
rescue Stripe::AuthenticationError => e
# Authentication with Stripe's API failed
# (maybe you changed API keys recently)
rescue Stripe::APIConnectionError => e
# Network communication with Stripe failed
rescue Stripe::StripeError => e
# Display a very generic error to the user, and maybe send
# yourself an email
rescue => e
# Something else happened, completely unrelated to Stripe
end
end
Ben sadece şu anda hatalardan kurtarmak ve gerçekten birinin ardından eyleme değilim ortaya atılan ve sonuçta ben o anki sınıfı durdurmak istiyorum: Burada gösterisi olarak benim Tescil modelinde Çizgili example hatalarını kullanıyorum kayıt olmasından ve bir flash hatası ile bir kullanıcıyı yönlendirmek.
rescure_from hakkında okudum ama olası tüm Şerit hatalarını işlemenin en iyi yolunun ne olduğundan emin değilim. Modelden yönlendiremediğimi biliyorum, uzmanlar bunu nasıl hallederdi?
İşte benim Tescil denetleyicisi var: yanıt verdiğiniz için
class Classroom::RegistrationsController < ApplicationController
before_filter :authenticate_user!
def new
if params[:session_id]
@session = Session.find(params[:session_id])
@registration = Registration.new(user: current_user, session: @session)
else
flash[:error] = "Course session is required"
end
rescue ActiveRecord::RecordNotFound
render file: 'public/404', status: :not_found
end
def create
if params[:session_id]
@session = Session.find(params[:session_id])
@registration = Registration.new(user: current_user, session: @session)
if @registration.save_with_payment(current_user, params[:stripe_card_token])
flash[:notice] = "Course registration saved with success."
logger.debug "Course registration saved with success."
mixpanel.track 'Registered to a session', { :distinct_id => current_user.id,
:id => @session.id,
'Name' => @session.name,
'Description' => @session.description,
'Course' => @session.course.name
}
mixpanel.increment current_user.id, { :'Sessions Registered' => 1}
mixpanel.track_charge(current_user.id, @session.price.to_i)
else
flash[:error] = "There was a problem saving the registration."
logger.debug "There was a problem saving the registration."
end
redirect_to root_path
else
flash[:error] = "Session required."
redirect_to root_path
end
end
end
sayesinde, çok takdir!
Francis
Girdiğiniz için teşekkürler, daha önce custom_validator'ı hiç duymamıştım (raylarla yeni başladı). Bu yüzden doğru bir şekilde anlarsam, tüm Stripe faturalama mantığını Kayıt modelimde bir yönteme koymalıyım? Kayıt kontrolörü ile ne olacak? Bir kullanıcıyı bir flash hatasıyla nasıl yönlendiririm? Birçok soru için üzgünüm, hala şaşkın :) –
Güncelleme% 100 kesin değil ama genel olarak fikir – rovermicrover
cevabını güncelledim, her zaman bir kayıt modeli veritabanına kaydedilir, validate: card_validation çağrılır (biraz bir önceki filtre gibi) ve sadece geçerli işlem/kartlar kaydedin. Girdiğiniz için teşekkürler! –