lib/task-manager/deadline_validator.rb in task-manager-0.1.2 vs lib/task-manager/deadline_validator.rb in task-manager-0.1.3
- old
+ new
@@ -1,27 +1,36 @@
+# ActiveModel 必须包含type或class_name_type(plan_type)属性
class DeadlineValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
type = get_type(record)
- if type.blank?
- record.errors[:type] << (options[:message] || 'invalid type')
- else
- record.errors[attribute] << (options[:message] || "deadline_hour is required") if value.blank? || value[:deadline_hour].blank?
- record.errors[attribute] << (options[:message] || "deadline_minute is required") if value.blank? || value[:deadline_minute].blank?
+ return unless type
- case type.to_sym
- when :weekly, :monthly
- record.errors[attribute] << (options[:message] || "deadline_day is required in a #{type} plan") if value.blank? || value[:deadline_day].blank?
- when :quarterly, :yearly
- record.errors[attribute] << (options[:message] || "deadline_month is required in a #{type} plan") if value.blank? || value[:deadline_month].blank?
- record.errors[attribute] << (options[:message] || "deadline_day is required in a #{type} plan") if value.blank? || value[:deadline_day].blank?
- else
- record.errors[attribute] << (options[:message] || "invalid type!") unless type.to_sym == :daily
- end
+ names = []
+ case type.to_sym
+ when :daily
+ names = [:hour, :minute]
+ when :weekly, :monthly
+ names = [:hour, :minute, :day]
+ when :quarterly, :yearly
+ names = [:hour, :minute, :day, :month]
end
+
+ validate_deadline_of(record, attribute, value, names)
end
+ private
def get_type(record)
return record.type if record.respond_to?(:type)
record.send("#{record.class.name.demodulize.underscore}_type")
end
+
+ def validate_deadline_of(record, attribute, value, names)
+ names = [names] unless names.is_a? Array
+
+ names.each do |name|
+ name = "deadline_#{name}".to_sym
+ record.errors[attribute] << ("#{name} is required") if value[name].blank?
+ end
+ end
+
end