Rails - 如何在数量

时间:2016-09-16 12:12:51

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller

我正在尝试允许用户一次预订多个空间的活动,因此,如果活动中的一个空间花费10英镑而用户想要预订四个空间,那么他们需要支付40英镑。 我已经在我的预订模型中实施了一个方法来迎合这个 -

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中的NoMethodError #create   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回调进行验证?

我不太确定如何做到这一点,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

只需转换为整数,在这种情况下,您似乎已完成:

self.total_amount = quantity.to_i * event.price_pennies.to_i

答案 1 :(得分:0)

迁移用于修改数据库的结构,而不是数据。

在您的情况下,我认为您需要使用默认值为数据库设定种子,为此,您需要使用每次部署应用程序时调用一次的“db / seeds.rb”文件。

你会在seeds.rb

做类似的事情
Booking.find_or_create_by_name('my_booking', quantity:1)

因此,在部署应用程序时,将执行上面的代码行。如果表中存在'my_booking'则没有任何反应,否则它将创建一个名为='my_booking'且数量= 1的新记录。

在你的localhost中,你将执行'rake db:seed'来为数据库播种。