活动预订网站 - 如何确保超额预订不会发生?

时间:2016-04-08 20:10:38

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

我正在使用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' %>
   

我在事件和预订模式之间有关联。我应该使用什么代码来确保可以监控特定事件的预订?我对Rails很陌生,所以这让我有点难过。

2 个答案:

答案 0 :(得分:0)

您可以在模型中使用验证,这样的事情可以在您创建新的预订记录时发挥作用

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

答案 1 :(得分:0)

有几种方法可以执行此操作,具体取决于数据的建模方式。而且您需要提供有关某人如何在活动中预订地点的更多信息。我将做一些假设,以便给你一些想法。活动有很多预订,预订属于活动。事件具有总数空间属性。活动预订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