Module: ValidatesTimeliness::ActionView::InstanceTag

Defined in:
lib/validates_timeliness/action_view/instance_tag.rb

Overview

Intercepts the date and time select helpers to reuse the values from the the params rather than the parsed value. This allows invalid date/time values to be redisplayed instead of blanks to aid correction by the user. Its a minor usability improvement which is rarely an issue for the user.

Defined Under Namespace

Classes: TimelinessDateTime

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



17
18
19
20
21
22
23
24
# File 'lib/validates_timeliness/action_view/instance_tag.rb', line 17

def self.included(base)
  selector_method = Rails::VERSION::STRING.to_f < 2.2 ? :date_or_time_select : :datetime_selector
  base.class_eval do
    alias_method :datetime_selector_without_timeliness, selector_method
    alias_method selector_method, :datetime_selector_with_timeliness
  end
  base.alias_method_chain :value, :timeliness
end

Instance Method Details

#datetime_selector_with_timeliness(*args) ⇒ Object



28
29
30
31
# File 'lib/validates_timeliness/action_view/instance_tag.rb', line 28

def datetime_selector_with_timeliness(*args)
  @timeliness_date_or_time_tag = true
  datetime_selector_without_timeliness(*args)
end

#value_with_timeliness(object) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/validates_timeliness/action_view/instance_tag.rb', line 33

def value_with_timeliness(object)
  unless @timeliness_date_or_time_tag && @template_object.params[@object_name]
    return value_without_timeliness(object)
  end

  pairs = @template_object.params[@object_name].select {|k,v| k =~ /^#{@method_name}\(/ }
  return value_without_timeliness(object) if pairs.empty?

  values = pairs.map do |(param, value)|
    position = param.scan(/\(([0-9]*).*\)/).first.first
    [position, value]
  end.sort {|a,b| a[0] <=> b[0] }.map {|v| v[1] }

  TimelinessDateTime.new(*values)
end