2017-08-29 72 views
0

我希望我的自定義驗證程序僅在其使用的屬性存在時才運行。Ruby on Rails:僅當其他屬性存在時才運行自定義驗證功能

# these are all dates 
validates :start_time, presence: true 
validates :end_time, presence: true 
validates :deadline_visitor, presence: true 
validates :deadline_host, presence: true 

# these validate the above dates 
validate :validate_all_dates 
validate :validate_dates 

例如:

def validate_all_dates 
    if self.start_time > self.end_time 
    errors.add(:start_time, 'must be before or the same day as end time') 
    end 
end 

失敗,因爲self.start_timeself.end_time不存在

回答

1

你可以將if參數添加到validate方法,這可以檢查所需的條件。該參數可以要麼是一個進程:

validates :validate_all_dates, if: Proc.new { |model| model.start_time.presence } 

或用一種方法:

validate :validate_all_dates, if: :dates_present? 

def dates_present? 
    start_time.presence && end_time.presence 
end 

看看這個指南的詳細信息:Conditional Validation

0

您可以添加驗證本身的變量的存在:

def validate_all_dates 
    if self.start_time && self.end_time && self.start_time > self.end_time 
    errors.add(:start_time, 'must be before or the same day as end  time') 
    end 
end