我正在使用Rails构建一个事件应用程序。我在我的控制器中安装了一个代码块,以确保在分配/预订事件的总空间数后不会发生超额预订。 问题是它只能在付款之后而不是之前付款。我需要代码在用户点击预订活动时显示一条Flash消息,但目前,它允许用户完成付款流程,拿走他们的钱,然后当它重定向回事件页面时闪存消息弹出。 它也适用于付费活动而非免费活动。
这是我的bookings_controller代码 -
{{1}}
可以在控制器中进行调整,还是需要模型中的方法?
答案 0 :(得分:0)
Rails提倡胖模型和超薄控制器。考虑到这一点,您应该将业务逻辑从控制器中拉出来。您可以将此代码放入模型中。
您可以将交易延长到行动结束。当出现问题时,您可能会出现错误并且事务将被回滚。如果在某些错误情况下付款已经完成,您必须处理/重新付款。
但是,您的代码遇到了两种竞争条件。第一场比赛条件从发送到贝宝的时间开始出现并回来。在这个时间内,第二个客户可以预订并支付一个活动,当第二个客户从paypal返回时,它不再被允许预订此活动。这可能是一段很长的时间,你应该重新做好顾客。
第二个竞争条件从此处开始if @event.bookings.count > @event.number_of_spaces
此语句可以同时为多个请求false
。即使只留下一个预订。在这种情况下,您最终会得到更多预订。