7

Railsで終了日が開始日より前ではなく、開始日が終了日より後であることを検証するための最良の方法は何ですか?

ビューコントローラにこれがあります:

<tr>
    <td><%= f.label text="Starts:" %></td>
    <td><%= f.datetime_select :start_date, :order => [:day, :month, :year]%></td>
</tr>
<tr>
    <td><%= f.label text="Ends:" %></td>
    <td><%= f.datetime_select :end_date,:order => [:day, :month, :year]</td>
</tr>

意味のあるメッセージとともに、ある種のポップアップを思い付くようにしたいと思います。

開始日と終了日の2つのパラメーターを受け取り、ビューコントローラーで呼び出すことができる汎用メソッドを作成したいと思います。fx上記のコードで。または、代わりにjQueryを使用する必要がありますか?

4

5 に答える 5

14

@YaBoyQuyクライアント側の検証は機能し、サーバーへのヒットを回避できます...

質問は、end_dateが開始後であることについてもあるため、検証(gemを使用)にも次のように記載するdate_validator必要があります。

validates :end_date, presence: true, date: { after_or_equal_to:  :start_date}

の提案

on: :create

end_date検証では正しくありません。論理的には、これも編集時に実行する必要があります。

私は簡潔な構文に基づいて賛成しました。

于 2014-03-27T08:18:47.797 に答える
6

クリーンでクリア(そして制御下にありますか?)

私はこれを読むのが最も明確だと思います:

あなたのモデルで

validates_presence_of :start_date, :end_date

validate :end_date_is_after_start_date


#######
private
#######

def end_date_is_after_start_date
  return if end_date.blank? || start_date.blank?

  if end_date < start_date
    errors.add(:end_date, "cannot be before the start date") 
  end 
end
于 2014-08-29T16:47:36.257 に答える
5

クライアント側の検証のみを行うため、クライアント側の検証は避けてください...組み込みのレール検証ツールを使用してください。

  validates :start_date, presence: true, date: { after_or_equal_to: Proc.new { Date.today }, message: "must be at least #{(Date.today + 1).to_s}" }, on: :create
  validates :end_date, presence: true
于 2012-08-31T16:41:29.103 に答える
2

クライアント側の検証が必要な場合は、jQueryを使用してください。

または、Railsでは、サーバー側を検証するために、独自のサーバーを作成できますか?

def date_validation
  if self[:end_date] < self[:start_date]
    errors[:end_date] << "Error message"
    return false
  else
    return true
  end
end
于 2012-08-30T14:30:38.033 に答える
2

あなたを使用するには、次のようなものvalidates :dt_end, :date => {:after_or_equal_to => :dt_start}が必要です。DateValidator


class DateValidator > ActiveModel::Validator
  def validate(record)
    the_end = record.dt_end
    the_start = record.dt_start
    if the_end.present?
      if the_end < the_start
        record.errors[:dt_end] << "The end date can't be before the start date. Pick a date after #{the_start}"
      end
    end
  end
end
于 2014-12-04T13:47:24.707 に答える