【发布时间】:2016-11-22 14:43:43
【问题描述】:
我正在使用 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
所以,由于某种原因,它没有保存或有其他不正确的地方。任何帮助表示赞赏。
【问题讨论】:
-
通过显示验证错误查看错误消息。
flash[:error] = @booking.errors.full_messages.join(',') -
您的代码似乎不完整......不确定您在 Booking 模型中的预订方法是从哪里调用的,但它似乎不是来自您的控制器。也可以方便地查看您的模型中有哪些验证。
-
完整预订模型代码现在添加了验证。有什么想法吗?而不是booking.is_free?它应该是带有 event.is_free 的 if/else 语句吗?那么“其他”付费方法代码? (参见下面的其他 cmets)
标签: ruby-on-rails ruby ruby-on-rails-4