2016-08-10 1 views
0

Я создаю приложение событий с использованием Rails, и я пытаюсь создать код, который сначала проверяет, что пробелы доступны, когда пользователь пытается заказать, и если да, то принимает их, чтобы забронировать мероприятие. я попал следующее сообщение об ошибке при попытке сделать бронирование -Rails/Stripe - отсутствует ошибка шаблона в контроллере заказов

бронирований Недостающие шаблоны/создать

def find(*args) 
    find_all(*args).first || raise(MissingTemplate.new(self, *args)) 
end 

def find_all(path, prefixes = [], *args) 

Я не уверен, что это не имеет ничего общего с ситуацией на бронирование в течение, как должно быть Я думаю, что это больше связано с кодом Stripe. Вот соответствующий код -

bookings_controller.rb

class BookingsController < ApplicationController 

before_action :authenticate_user! 

def new 
    # booking form 
    # I need to find the event that we're making a booking on 
    @event = Event.find(params[:event_id]) 
    # and because the event "has_many :bookings" 
    @booking = @event.bookings.new 
    # which person is booking the event? 
    @booking.user = current_user 
    #@booking.quantity = @booking.quantity 
    #@total_amount = @booking_quantity.to_f * @event_price.to_f 

end 

def create 
    # actually process the booking 
    @event = Event.find(params[:event_id]) 
    @booking = @event.bookings.new(booking_params) 
    @booking.user = current_user 
    #@total_amount = @booking.quantity.to_f * @event.price.to_f 

    Booking.transaction do 
     @booking.save! 
     @event.reload 
     if @event.bookings.count > @event.number_of_spaces 
      flash[:warning] = "Sorry, this event is fully booked." 
      raise ActiveRecord::Rollback, "event is fully booked" 
     else 
      if @booking.save 

       # CHARGE THE USER WHO'S BOOKED 
       # #{} == puts a variable into a string 
       Stripe::Charge.create(amount: @event.price_pennies, currency: "gbp", 
        card: @booking.stripe_token, description: "Booking number #{@booking.id}") 

       flash[:success] = "Your place on our event has been booked" 
       redirect_to event_path(@event) 
      else 
       flash[:error] = "Payment unsuccessful" 
       render "new" 
      end 

      if @event.is_free? 

       @booking.save! 
       flash[:success] = "Your place on our event has been booked" 
       redirect_to event_path(@event) 
      end 

     end 
    end 


end 


#def total_amount 
    #@total_amount = @booking.quantity * @event.price 
#end 

private 

def booking_params 
    params.require(:booking).permit(:stripe_token, :quantity) 
end 



end 

new.html.erb (заказы) -

<div class="col-md-6 col-md-offset-3" id="eventshow"> 
    <div class="row"> 
    <div class="panel panel-default"> 
     <div class="panel-heading"> 
      <h2>Confirm Your Booking</h2> 
     </div> 

      <div class="panel-body">  

       <p>Total Amount<%= @event.price %></p> 
       <%= simple_form_for [@event, @booking], id: "new_booking" do |form| %> 





       <span class="payment-errors"></span> 

       <div class="form-row"> 
        <label> 
         <span>Card Number</span> 
         <input type="text" size="20" data-stripe="number"/> 
        </label> 
       </div> 

       <div class="form-row"> 
        <label> 
        <span>CVC</span> 
        <input type="text" size="4" data-stripe="cvc"/> 
        </label> 
       </div> 

       <div class="form-row"> 
        <label> 
         <span>Expiration (MM/YYYY)</span> 
         <input type="text" size="2" data-stripe="exp-month"/> 
        </label> 
        <span>/</span> 
        <input type="text" size="4" data-stripe="exp-year"/> 
       </div> 
      </div> 
      <div class="panel-footer">  

       <%= form.button :submit %> 


      </div> 

<% end %> 
<% end %> 

     </div> 
    </div> 
</div>  

<script type="text/javascript" src="https://js.stripe.com/v2/"></script> 

<script type="text/javascript"> 
    Stripe.setPublishableKey('<%= STRIPE_PUBLIC_KEY %>'); 
    var stripeResponseHandler = function(status, response) { 
    var $form = $('#new_booking'); 

    if (response.error) { 
    // Show the errors on the form 
    $form.find('.payment-errors').text(response.error.message); 
    $form.find('input[type=submit]').prop('disabled', false); 
    } else { 
    // token contains id, last4, and card type 
    var token = response.id; 
    // Insert the token into the form so it gets submitted to the server 
    $form.append($('<input type="hidden" name="booking[stripe_token]"  />').val(token)); 
    // and submit 
    $form.get(0).submit(); 
    } 
    }; 

    // jQuery(function($) { - changed to the line below 
    $(document).on("ready page:load", function() { 

    $('#new_booking').submit(function(event) { 
     var $form = $(this); 

     // Disable the submit button to prevent repeated clicks 
     $form.find('input[type=submit]').prop('disabled', true); 

     Stripe.card.createToken($form, stripeResponseHandler); 

     // Prevent the form from submitting with the default action 
     return false; 
    }); 
    }); 
</script> 

ответ

0

Вы не должны сохранить номер, а затем проверить счета. Вместо этого вы можете это сделать.

def create 
    # actually process the booking 
    @event = Event.find(params[:event_id]) 
    @booking = @event.bookings.new(booking_params) 
    @booking.user = current_user 
    #@total_amount = @booking.quantity.to_f * @event.price.to_f 

    Booking.transaction do 
     if @event.bookings.count == @event.number_of_spaces 
      flash[:warning] = "Sorry, this event is fully booked." 
      raise ActiveRecord::Rollback, "event is fully booked" 
     else 
      if @booking.save 

       # CHARGE THE USER WHO'S BOOKED 
       # #{} == puts a variable into a string 
       Stripe::Charge.create(amount: @event.price_pennies, currency: "gbp", 
        card: @booking.stripe_token, description: "Booking number #{@booking.id}") 

       flash[:success] = "Your place on our event has been booked" 
       redirect_to event_path(@event) 
      else 
       flash[:error] = "Payment unsuccessful" 
       render "new" 
      end 

      if @event.is_free? 

       @booking.save! 
       flash[:success] = "Your place on our event has been booked" 
       redirect_to event_path(@event) 
      end 

     end 
    end 


end 
+0

Спасибо. Я пробовал это раньше, но то, что я нахожу, это то, что приложение принимает меня через процесс платежей в Stripe. THEN сообщает мне, что мероприятие полностью забронировано. Мне нужно, чтобы он сказал мне, что мероприятие полностью забронировано, прежде чем он попытается взять мои деньги. –

+0

Кроме того, я все еще получаю такую ​​же ошибку. Это не сработало. –