【问题标题】:Validate that an end_date is later than a start_date in Rails 4在 Rails 4 中验证 end_date 是否晚于 start_date
【发布时间】:2015-11-10 21:19:36
【问题描述】:

我正在尝试确定在表单中验证 end_date 是否大于 start_date 的最佳方法。

如果有人不小心选择了大于 end_date 的 start_date,我不知道如何抛出错误。

在我的表单中,如果事件只有一天,我只能提交一个日期(我使用 javascript 将 start_date 选择值复制到 end_date 选择值中),或者如果事件是 start_date 和 end_date超过 24 小时。

屏幕截图中的以下场景应触发表单的第三个错误。

这是表格的相关部分:

event_form.html.erb

<%= form_for(@event, html: { multipart: true }) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="checkbox">
  <label>
    <%= f.check_box :single_day %> Is this a multi-day event?
  </label>
</div>
<div class="field">
  <%= f.label :start_date %><br />
  <%= f.date_select :start_date, :start_year => Date.current.year, :end_year => 1900  %>
</div>
<div id="end_date_div" class="field">
  <%= f.label :end_date %><br />
  <%= f.date_select :end_date, :start_year => Date.current.year, :end_year => 1900  %>
</div>
<%= f.submit "Post", class: "btn btn-primary", :id=>"event_submit" %>
<% end %>

event.rb

class Event < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id, presence: true
  validates :title,   presence: true
  validates :content, presence: true
  validate  :picture_size

  private

    # Validates the size of an uploaded picture.
    def picture_size
      if picture.size > 5.megabytes
        errors.add(:picture, "should be less than 5MB")
      end
    end
end

events_controller.erb

class EventsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user,   only: :destroy

  def create
    @event = current_user.events.build(event_params)
    if @event.save
      flash[:success] = "Event created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

  def destroy
    @event.destroy
    flash[:success] = "Event deleted"
    redirect_to request.referrer || root_url
  end

  private

    def event_params
        #may need to add the other variables here
      params.require(:event).permit(:title, :content, :single_day, :start_date, :end_date, :picture)
    end

    def correct_user
      @event = current_user.events.find_by(id: params[:id])
      redirect_to root_url if @event.nil?
    end
end

【问题讨论】:

    标签: forms validation ruby-on-rails-4


    【解决方案1】:

    您正在寻找的是您的end_date 字段上的另一个自定义验证。您可以在模型中编写如下内容:

    validate :end_date_after_start_date?
    
    def end_date_after_start_date?
      if end_date < start_date
        errors.add :end_date, "must be after start date"
      end
    end
    

    这会手动将错误添加到您的模型中,以确保验证不会成功。

    有关自定义验证的更多信息: http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations

    【讨论】:

    • 正是我想要的。如果我没有在这里阅读它,我也不会知道自定义验证。感谢您的链接。
    • 我想知道你的代码是从哪里得到的,因为它包含一个,因此我提到了 另一个 一个;)
    • @sevenseacat 我怎样才能随着时间的推移获得相同的行为,我有两个下拉列表 start_timeend_time 填充了字符串值,例如 ['00:00', '00:15',' 00:30',...,'23:45']。如何验证?
    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2019-12-18
    • 2021-09-27
    • 2023-03-12
    • 1970-01-01
    • 2017-06-07
    • 2017-05-11
    • 2020-09-09
    相关资源
    最近更新 更多