【问题标题】:Event Booking site - how to ensure over-booking doesn't occur?活动预订网站 - 如何确保不会发生超额预订?
【发布时间】:2016-04-08 20:10:38
【问题描述】:

我正在使用 Ruby on Rails 构建一个活动网站,但我不确定我可以实施什么代码来监控预订,以确保在可用空间已满时不允许预订。

我正在使用 simple_form 创建事件,这是部分 -

<%= simple_form_for(@event) do |f| %>
    <% if @event.errors.any? %>
        <h2><%= pluralize(@event.errors.count, "error") %> prevented this     Event from saving:</h2>
    <ul>
        <% @event.errors.full_message.each do |message| %>
        <li><%= message %></li>
        <% end %>
    </ul>
<%= f.collection_select :category_id, Category.all, :id, :name, {prompt: "Choose a category"} %>
<!-- The above code loop assigns a category_id to each event -->

<%= f.input :image, as: :file, label: 'Image' %>
<%= f.input :title, label: 'Event Title' %>
<label>Location</label><%= f.text_field :location, id: 'geocomplete' %></br>
<label>Date</label><%= f.text_field :date, label: 'Date', id: 'datepicker' %>
<%= f.input :time, label: 'Time' %>
<%= f.input :description, label: 'Description' %>
<label>Number of spaces available</label><%= f.text_field :number_of_spaces, label: 'Number of spaces' %>
<%= f.input :is_free, label: 'Tick box if Event is free of charge' %>
<%= f.input :price, label: 'Cost per person (leave blank if free of charge)' %>
<%= f.input :organised_by, label: 'Organised by' %>
<%= f.input :organiser_description, label: 'Organiser description' %>
<%= f.input :url, label: "Link to Organiser site" %>

<%= f.button :submit, label: 'Submit' %>

我在 Event 和 Booking 模型之间建立了关联。我应该实施什么代码来确保可以监控特定活动的预订?我对 Rails 很陌生,所以这让我有点难过。

【问题讨论】:

    标签: ruby-on-rails ruby validation simple-form


    【解决方案1】:

    您可以在模型中使用验证,每当您创建新的预订记录时,这样的事情就可以解决问题

    validates_inclusion_of :number, :in => 0..10 # Or whatever number you want
    

    或者

    validates :number, :numericality => {:less_than_or_equal_to => 10 } # Or Whatever number you want
    

    【讨论】:

      【解决方案2】:

      根据您的数据建模方式,有几种方法可以做到这一点。您需要提供有关某人如何在活动中预订位置的更多信息。为了给你一些想法,我将做一些假设。一个 Event 有很多 Bookings,一个 Booking 属于一个 Event。事件具有空间总数属性。已预订活动的 1 个空间。

      为防止超额预订,您需要禁止显示表单并添加一些控制器逻辑。

      在控制器创建方法中(这取决于您未显示的预订表格)。

      def create
        @event = Event.find(params[:event_id)
        if @event.bookings.count >= @event.total_spaces
          flash[:warning] = "Sorry, this event is fully booked."
          redirect_to root_path
        else
          #some code to save the booking
        end
      end
      

      在视图中,在表单代码之前,添加一些逻辑

      <% if @event.bookings.count < @event.total_spaces
      

      【讨论】:

      • 没有单独的预订表格,因此。上面的表格创建的事件包括一个用于规定可用空间数量的部分。我的事件模型中有一个 number_of_spaces 属性。 Event 和 Booking 模型之间的关联如上所述。
      • 要预订活动,活动页面底部有一个框,可将用户带到付款页面,但是,正如您所建议的,我还需要为免费活动编写一些代码超额预订也可能是一个问题。上面看起来很扎实。
      • 同样的逻辑适用,如果活动已订满,则不要显示引导用户进入支付页面的框。如果以上内容有帮助,请将我的答案标记为已接受或投票。谢谢。
      • 您好,不,这不起作用。出于某种原因,我认为数据库不会在预订时记录它们。
      • 您需要调试为什么没有将预订保存到 d/b。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      相关资源
      最近更新 更多