2015-06-15 6 views
0

Использование Stripe и хотите: 1. проверить соответствие модели 2. Если ошибок не было, проверьте маркер карты. 3. Если карта работает, сохраните новую запись.Проверка валидации перед сохранением рельсов

Ниже у меня есть он, где он сначала обрабатывает карту, а затем в случае успеха сохраняет запись. К сожалению, эта запись может завершиться неудачей, но карта уже была заряжена.

В качестве взлома у меня есть проверка js (которая отражает валидацию модели) в представлении, которое не позволяет отправить форму до тех пор, пока условия не будут выполнены.

Tourregistration.rb Контроллер

def create 
token = params[:tourregistration][:stripeToken] 
begin 
    charge = Stripe::Charge.create(
    :amount => (params[:tourregistration][:invoice].to_d*100).round, 
    :currency => "usd", 
    :source => token, 
    :description => "Example charge" 
) 
rescue Stripe::CardError => e 
    # The card has been declined 
    redirect_to :back, :notice => "#{e}" 
else 

@tourregistrations = tourregistration_data.map do |tourregistration_params| 
    Tourregistration.new(tourregistration_params) 
end 

@tourregistrations.each(&:save) 

    if @tourregistrations.all?(&:valid?) 
    flash[:notice] = 'Sign-up Complete' 
    redirect_to root_url 
    else 
    redirect_to :back, :notice => "Something went wrong. Please fill in all fields." 
    end  
end 

конец

Tourregistration.rb Модель

class Tourregistration < ActiveRecord::Base 
belongs_to :patron 
belongs_to :tour 
has_one :referrer 

validates :fname, length: { minimum: 2} 
validates :lname, length: { minimum: 2} 
validates :email, presence: true 
validates :price, presence: true 
validates :invoice, presence: true 
validates :patron_id, presence: true 
validates :tour_id, presence: true 
end 

ответ

1

Кроме обратных вызовов, вы можете использовать database transaction, например:

ActiveRecord::Base.transaction do 
    results = @tourregistrations.map(&:save) # validate and save the records 
    raise ActiveRecord::Rollback if results.any?{|result| result == false } # rollback the transaction if any registration failed to be saved 
    payment = charge_card # process the payment 
    raise ActiveRecord::Rollback unless payment # rollback if payment failed 
end 

В качестве побочного примечания эта логика представляет собой пример учебника для service object.

Смежные вопросы