2012-08-30 205 views
4

驗證結束日期不在開始日期之前並且開始日期在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> 

我希望它拿出各種各樣的彈出窗口中,用一個有意義的消息。

我想做一個通用的方法,它需要兩個參數,開始和結束日期,然後我可以在我的viewcontroller調用; fx在上面的代碼中。或者,我需要使用jQuery嗎?

回答

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 
+0

爲什麼需要從'date_val'返回真值idation'? –

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 
+6

這是否需要一個寶石(https://github.com/codegram/date_validator)? – echo

9

@YaBoyQuy 客戶端驗證可以正常工作,避免了命中服務器...

的問題也即將開始後END_DATE之中,因此在驗證時也應註明

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

on: :create 

的建議將是不正確的驗證END_DATE;從邏輯上講,這也應該在編輯時運行。

我基於簡潔的語法向上投票。

3

清潔和清除(控制住?)

我覺得這是最清晰的閱讀:

在模型

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 
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 
相關問題