ruby-on-rails - 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
当我将开始日期更改为一周前时,它通过了第一个测试。
解决方案
你可以有一个只显示错误的 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 %>
推荐阅读
- database - 如何将行插入到 WordPress 自定义表中
- ruby - 如何在 Ruby 代码中指定 --form 字段(对于 HTTP GET 请求)?
- android - Flutter在运行测试应用程序时出现错误
- java - 如何使浮动操作栏居中底部
- android - Android WorkManager 不会触发两个计划工作人员之一
- database - 数据库负载平衡如何工作以及如何保持同步?
- c - 为什么这段代码只写出第一次和最后一次出现的 nome、cognome 和 cf?
- php - 如何使用 PHP 将变量值添加到 SQL 中的现有表值
- phaser-framework - Phaser 3 中的 Image 和 Sprite 有什么区别?
- android - 如何在android设备上获取已安装apk的子进程信息