首页 > 解决方案 > RecordInvalid,自定义日期验证失败

问题描述

我正在尝试验证房间预订入住日期是否在退房日期之前和今天之后。

当我运行代码时,我得到错误:

ActiveRecord::RecordInvalid on BookingsController#create
Validation failed: Check in Invalid Start Date

我猜这是验证工作,但是我需要应用程序不会崩溃,而是向用户显示错误。

预订控制器:

def create
    @booking = Booking,create(booking_params)
    current_user.bookings << @booking         ##Error is called here.

预订.rb:

validate :val_start_before_end
validate :val_start_after_today

def val_start_before_end
    errors.add(:check_out, "Invalid Date") if check_out < check_in
end

def val_start_after_today
    errors.add(:check_in, "Invalid Start Date") if check_in < Date.today ##Error is called here
end

当我将开始日期更改为一周前时,它通过了第一个测试。

标签: ruby-on-rails

解决方案


你可以有一个只显示错误的 div。

新的.html.erb:

<% if @booking.errors.any? %>
  <%= tag.div class: 'alert alert-danger' do %>
    <p>
      <%= pluralize(@booking.errors.count, "error") %> prohibited
      this form from being saved. See and correct the errors below before 
      submitting.
    </p>
    <ol>
      <% @booking.errors.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ol>
<% end %>

bookings_controller.rb:

def create
  @booking = Booking.new(booking_params)

  if @booking.save
    flash[:success] = "Booking saved"
    redirect_to bookings_path
  else
    render 'new'
  end
end

另外,如果你在表单中放了一个带有当前用户ID的表单域(我通常做一个隐藏域),那么你不需要放入current_user.bookings << @booking你的控制器。

<%= f.hidden_field :user_id, value: current_user.id %>

推荐阅读