繁体   English   中英

Rails错误-预订失败

[英]Rails error - Booking unsuccessful

我正在使用Rails构建Event应用。 我最近更改了我的预订控制器,以容纳免费的活动。 该应用程序的这一端似乎工作正常,但是当我尝试付费活动的测试预订时,在我完成付款提交表格后,该应用程序默认为“预订失败”。

我不太确定为什么会这样。 这是我的控制器逻辑-

def new

        @event = Event.find(params[:event_id])
        @booking = Booking.new
        @booking.user = current_user



    end

    def create
        @event = Event.find(params[:event_id])
        @booking = Booking.new(booking_params)
        @booking.user = current_user


            if 
                @booking.save
                flash[:success] = "Your place on our event has been booked"
                redirect_to event_booking_path(@event, @booking)
            else
                flash[:error] = "Booking unsuccessful"
                render "new"
            end

    end

    def show
        @event = Event.find(params[:event_id])
        @booking = Booking.find(params[:id])
    end


    def update

        if @booking.update(booking_params)
            redirect_to event_booking_path(@event, @booking) , notice: "Booking was successfully updated!"
        else
            render 'new'
        end
    end




    private

    def booking_params
        params.require(:booking).permit(:stripe_token, :booking_number, :quantity, :event_id, :stripe_charge_id, :total_amount)
    end

在我的模型中,我有这个-

Booking.rb

   class Booking < ActiveRecord::Base

    belongs_to :event
    belongs_to :user


  before_create :set_booking_number 

     validates :quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
     validates :total_amount, presence: true, numericality: { greater_than_or_equal_to: 0 }
     validates :quantity, :total_amount, :booking_number, presence: true

  def set_booking_number
    self.booking_number = "MAMA" + '- ' + SecureRandom.hex(4).upcase
  end



    def booking
        # Don't process this booking if it isn't valid
        self.valid?

          if booking.is_free?
            self.total_amount = event.price_pennies.nil?
            save!
          end



            begin
                        self.total_amount = event.price_pennies * self.quantity
                        charge = Stripe::Charge.create(
                            amount: total_amount,
                            currency: "gbp",
                            source: stripe_token, 
                            description: "Booking created for amount #{total_amount}")
                        self.stripe_charge_id = charge.id
              self.booking_number = "MAMA" + '- ' + SecureRandom.hex(4).upcase
                        save!
                    rescue Stripe::CardError => e
                    errors.add(:base, e.message)
                    false
                end

  end
end

因此,由于某种原因,它无法保存,或者还有其他不正确的地方。 任何帮助表示赞赏。

这是完整的代码吗? 您的“ booking.rb”似乎完全错误。

您正在定义“预订”方法,但是我看不到您在任何地方调用它。 当执行时,可能在预订方法本身中

if booking.is_free?

你在那里混东西了吗?

好吧,让我们看看。

我认为您需要这样的东西:

class Booking < ActiveRecord::Base

  belongs_to :event
  belongs_to :user
  before_create :set_booking_number
  ### new
  before_save(:set_total_amount)

  validates :quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
  validates :total_amount, presence: true, numericality: { greater_than_or_equal_to: 0 }
  validates :quantity, :total_amount, :booking_number, presence: true
  ### new
  validate(:validate_booking)

  def set_booking_number
    self.booking_number = "MAMA" + '- ' + SecureRandom.hex(4).upcase
  end

  def set_total_amount
    # does event.is_free? exist? if not: either define .is_free? or use self.event.price_pennies.nil? or self.event.price_pennies.to_i == 0
    if self.event.is_free?
      # I am guessing total_amount is an Int but you are assigning a boolean
      # self.total_amount = event.price_pennies.nil?
      # should be
      self.total_amount = 0
    else
      self.total_amount = event.price_pennies * self.quantity
      begin
        charge = Stripe::Charge.create(
          amount: total_amount,
          currency: "gbp",
          source: stripe_token, 
          description: "Booking created for amount #{total_amount}")
        self.stripe_charge_id = charge.id
      rescue Stripe::CardError => e
        # if this fails stripe_charge_id will be null, but in case of update we just set it to nil again
        self.stripe_charge_id = nil
        # we check in validatition if nil
      end
      # booking number was already set, see set_booking_number
      # self.booking_number = "MAMA" + '- ' + SecureRandom.hex(4).upcase
    end
  end

  # is suppose to be a validation, so I renamed it
  # def booking
  def validate_booking
    # Don't process this booking if it isn't valid
    # will be called on .save anyway
    # self.valid?

    # I pushed this to set_total_amount (called by before_save)
    #    if booking.is_free?
    #      self.total_amount = event.price_pennies.nil?
    # Why call save! ? with "!" it will cast an exception if invalid
    #      save!
    #    end

    # also pushed to set_total_amount since this has nothing to do with validation
    #      begin
    #                  self.total_amount = event.price_pennies * self.quantity
    #                  charge = Stripe::Charge.create(
    #                      amount: total_amount,
    #                      currency: "gbp",
    #                      source: stripe_token, 
    #              description: "Booking created for amount #{total_amount}")
    #                  self.stripe_charge_id = charge.id
    #        self.booking_number = "MAMA" + '- ' + SecureRandom.hex(4).upcase
    #                  save!
    #              rescue Stripe::CardError => e
    #              errors.add(:base, e.message)
    #              false
    #          end

    # stripe_charge_id must be set for not free events
    unless self.event.is_free?
      return !self.stripe_charge_id.nil?
    end
  end
end

这当然是未经测试的。 但去吧。

希望我的评论清楚。

最后,在参数方面进行了一些工作,并在模型代码上进行了工作。 这是我的控制器和模型中的最终代码-

Booking.rb

class Booking < ActiveRecord::Base

  belongs_to :event
  belongs_to :user
  before_create :set_booking_number


  validates :quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
  validates :total_amount, presence: true, numericality: { greater_than_or_equal_to: 0 }

  validate(:validate_booking)

  def set_booking_number
    self.booking_number = "MAMA" + '- ' + SecureRandom.hex(4).upcase
  end

  def set_booking

    if self.event.is_free?
      self.total_amount = 0
      save!
    else
      self.total_amount = event.price_pennies * self.quantity
      begin
        charge = Stripe::Charge.create(
          amount: total_amount,
          currency: "gbp",
          source: stripe_token, 
          description: "Booking created for amount #{total_amount}")
        self.stripe_charge_id = charge.id
        save!
      rescue Stripe::CardError => e
        self.stripe_charge_id = nil

      end
    end
  end

    unless self.event.is_free?
      return !self.stripe_charge_id.nil?
    end
  end
end

Bookings_controller.rb

class BookingsController < ApplicationController

    before_action :authenticate_user!



    def new
        @event = Event.find(params[:event_id])
        # and because the event "has_many :bookings"
        @booking = Booking.new(params[:booking])
        @booking.user = current_user



    end

    def create

        # actually process the booking
        @event = Event.find(params[:event_id])
        @booking = @event.bookings.new(booking_params)
        @booking.user = current_user


            if 
                @booking.set_booking
                flash[:success] = "Your place on our event has been booked"
                redirect_to event_booking_path(@event, @booking)
            else
                flash[:error] = "Booking unsuccessful"
                render "new"
            end

            if @event.is_free?
                @booking.save(booking_params)
            end
    end

    def show
        @event = Event.find(params[:event_id])
        @booking = Booking.find(params[:id])
    end


    def update

        if @booking.update(booking_params)
            redirect_to event_booking_path(@event, @booking) , notice: "Booking was successfully updated!"
        else
            render 'new'
        end
    end




    private

    def booking_params
        params.require(:booking).permit(:stripe_token, :booking_number, :quantity, :event_id, :stripe_charge_id, :total_amount)
    end






end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM