如何阻止用户在过去的DateTime Ruby中预订?

时间:2018-05-04 12:20:55

标签: ruby-on-rails ruby

我已经为用户预订了他们的教师。我目前面临的问题是,如何阻止用户过去预订?我使用过DateTime。

另一个问题是如果用户设置了启动DateTime,我该如何防止结束DateTime小于启动DateTime?

我没有尝试过,我可以提出建议。目前的代码显示了如何停止双重预订。

_form.hmtl.erb

<%= form_for(@lesson) do |f| %>

  <div class="field">
  <%= f.label :user_id %><br>
    <%= f.number_field :user_id %>
  </div>
  <div class="field">
    <%= f.label :lesson_start_date_time %><br>
    <%= f.datetime_select :lesson_start_date_time %>
  </div>
  <div class="field">
    <%= f.label :lesson_end_date_time %><br>
    <%= f.datetime_select :lesson_end_date_time %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Lesson.rb

class Lesson < ActiveRecord::Base


belongs_to :user

validate :lessons_must_not_overlap

private

def lessons_must_not_overlap
   return if self
          .class
          .where.not(id: id)
          .where(user_id: user_id)
          .where('lesson_start_date_time < ? AND lesson_end_date_time > ?', lesson_end_date_time, lesson_start_date_time)
          .none?

   errors.add(:base, 'Overlapping lesson exists')
end

end

2 个答案:

答案 0 :(得分:2)

只需添加一个验证来检查

  1. start date已过去
  2. end_date小于start_date
  3. 试一试

    validate :datetime_eligibility
    
    private
    
    #...
    
    def datetime_eligibility
      # Check if `start_date` is less than `current time`
      if lesson_start_date_time < Time.current 
        errors.add(:base, "can't be in past")
      # Check if `end_date` is less than `start_date`
      elsif  lesson_end_date_time < lesson_start_date_time
        errors.add(:base, 'start date should be less than end date')
      end
    end
    

    注意:请始终将日期时间与Time.current而不是Time.now进行比较,以避免TimeZone与应用程序发生问题

答案 1 :(得分:2)

您永远不应该信任用户输入(因此html中的任何更改都无关紧要)

您只需要验证来自用户的日期(保持验证尽可能简单,一个验证应该有一个责任)

validates :lesson_end_date_time, :lesson_start_date_time, presence: true
validate :start_date_in_future, :dates_has_positive_length

private

def start_date_in_future
  return if lesson_start_date_time.blank?
  return if lesson_start_date_time >= Date.current
  errors.add(:lesson_start_date_time, :invalid)
end

def dates_has_positive_length
  return if lesson_end_date_time.blank? || lesson_start_date_time.blank?
  return if lesson_end_date_time >= lesson_start_date_time
  errors.add(:lesson_end_date_time, :invalid)
end