![](/img/trans.png)
[英]Throw a 404 error on unsuccessful authentication: devise + rails custom auth strategy
[英]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.