【发布时间】:2016-09-16 12:12:51
【问题描述】:
我正在尝试允许用户一次为多个空间预订活动,因此如果活动中的一个空间花费 10 英镑,而用户想要预订四个空间,那么他们需要支付 40 英镑。 我已经在我的 Booking 模型中实现了一个方法来解决这个问题 -
Booking.rb
class Booking < ActiveRecord::Base
belongs_to :event
belongs_to :user
def reserve
# Don't process this booking if it isn't valid
return unless valid?
# We can always set this, even for free events because their price will be 0.
self.total_amount = quantity * event.price_pennies
# Free events don't need to do anything special
if event.is_free?
save
# Paid events should charge the customer's card
else
begin
charge = Stripe::Charge.create(amount: total_amount, currency: "gbp", card: @booking.stripe_token, description: "Booking number #{@booking.id}", items: [{quantity: @booking.quantity}])
self.stripe_charge_id = charge.id
save
rescue Stripe::CardError => e
errors.add(:base, e.message)
false
end
end
end
end
当我尝试处理预订时,我收到以下错误 -
BookingsController#create 中的 NoMethodError nil:NilClass 的未定义方法 `*'
这行代码被高亮显示-
self.total_amount = quantity * event.price_pennies
我需要检查/确保数量返回 1 或更大的值,如果是免费活动,则 event.price_pennies 返回 0,如果是付费活动,则返回大于 0。我该怎么做呢?
我没有在迁移中为数量设置任何默认值。我的 schema.rb 文件显示了 price_pennies -
t.integer "price_pennies", default: 0, null: false
这是我的控制器中用于创建的内容 -
bookings_controller.rb
def create
# actually process the booking
@event = Event.find(params[:event_id])
@booking = @event.bookings.new(booking_params)
@booking.user = current_user
if @booking.reserve
flash[:success] = "Your place on our event has been booked"
redirect_to event_path(@event)
else
flash[:error] = "Booking unsuccessful"
render "new"
end
end
那么,我是否需要在我的预订模型中使用一种方法来纠正这个问题,或者我应该对数量进行验证并为事件进行 before_save 回调?
我不太确定如何执行此操作,因此我们将不胜感激。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller