mirror of
https://github.com/ditkrg/validates_timeliness.git
synced 2026-01-23 06:16:44 +00:00
changed format of string used in multi param for invalid or partial values
This commit is contained in:
parent
f1a0016bf7
commit
82c0e1bcd3
@ -10,10 +10,14 @@ module ValidatesTimeliness
|
||||
# attribute value before type cast to be used as in the select helpers.
|
||||
# This means that an invalid date or time will be redisplayed rather than the
|
||||
# type cast value which would be nil if invalid.
|
||||
#
|
||||
# Its a minor user experience improvement to be able to see original value
|
||||
# entered to aid correction.
|
||||
#
|
||||
module InstanceTag
|
||||
|
||||
def self.included(base)
|
||||
selector_method = Rails::VERSION::STRING < '2.2' ? :date_or_time_select : :datetime_selector
|
||||
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
|
||||
@ -37,9 +41,11 @@ module ValidatesTimeliness
|
||||
return value_without_timeliness(object)
|
||||
end
|
||||
|
||||
time_array = ValidatesTimeliness::Formats.parse(raw_value, :datetime)
|
||||
date, time = raw_value.split(' ')
|
||||
date_array = date.split('-')
|
||||
time_array = time.split(':')
|
||||
|
||||
TimelinessDateTime.new(*time_array[0..5])
|
||||
TimelinessDateTime.new(*(date_array + time_array).map {|v| v.blank? ? nil : v.to_i})
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@ -22,12 +22,12 @@ module ValidatesTimeliness
|
||||
end
|
||||
|
||||
def extract_date_from_multiparameter_attributes(values)
|
||||
year = ValidatesTimeliness::Formats.unambiguous_year(values[0].rjust(2, "0"))
|
||||
[year, *values.slice(1, 2).map { |s| s.rjust(2, "0") }].join("-")
|
||||
year = values[0].blank? ? nil : ValidatesTimeliness::Formats.unambiguous_year(values[0].rjust(2, "0"))
|
||||
[year, *values.slice(1, 2).map { |s| s.blank? ? nil : s.rjust(2, "0") }].join("-")
|
||||
end
|
||||
|
||||
def extract_time_from_multiparameter_attributes(values)
|
||||
values[3..5].map { |s| s.rjust(2, "0") }.join(":")
|
||||
values[3..5].map { |s| s.blank? ? nil : s.rjust(2, "0") }.join(":")
|
||||
end
|
||||
|
||||
end
|
||||
@ -39,7 +39,6 @@ module ValidatesTimeliness
|
||||
end
|
||||
|
||||
# Assign dates and times as formatted strings to force the use of the plugin parser
|
||||
# and store a before_type_cast value for attribute
|
||||
def execute_callstack_for_multiparameter_attributes_with_timeliness(callstack)
|
||||
errors = []
|
||||
callstack.each do |name, values|
|
||||
@ -47,7 +46,7 @@ module ValidatesTimeliness
|
||||
if column && [:date, :time, :datetime].include?(column.type)
|
||||
begin
|
||||
callstack.delete(name)
|
||||
if values.empty?
|
||||
if values.empty? || values.all?(&:nil?)
|
||||
send("#{name}=", nil)
|
||||
else
|
||||
value = ValidatesTimeliness::ActiveRecord.time_array_to_string(values, column.type)
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
||||
|
||||
ValidatesTimeliness.enable_datetime_select_extension!
|
||||
|
||||
describe 'ValidatesTimeliness::ActionView::InstanceTag' do
|
||||
include ActionView::Helpers::DateHelper
|
||||
include ActionController::Assertions::SelectorAssertions
|
||||
@ -39,4 +37,27 @@ describe 'ValidatesTimeliness::ActionView::InstanceTag' do
|
||||
output = datetime_select(:person, :birth_date_and_time, :include_blank => true, :include_seconds => true)
|
||||
output.should have_tag('select', 6)
|
||||
end
|
||||
|
||||
it "should display datetime_select with no values selected for missing parts" do
|
||||
@person.birth_date_and_time = '2000-- ::'
|
||||
output = datetime_select(:person, :birth_date_and_time, :include_blank => true, :include_seconds => true)
|
||||
output.should have_tag('select[id=person_birth_date_and_time_1i]') do
|
||||
with_tag('option[selected=selected]')
|
||||
end
|
||||
output.should have_tag('select[id=person_birth_date_and_time_2i]') do
|
||||
without_tag('option[selected=selected]')
|
||||
end
|
||||
output.should have_tag('select[id=person_birth_date_and_time_3i]') do
|
||||
without_tag('option[selected=selected]')
|
||||
end
|
||||
output.should have_tag('select[id=person_birth_date_and_time_4i]') do
|
||||
without_tag('option[selected=selected]')
|
||||
end
|
||||
output.should have_tag('select[id=person_birth_date_and_time_5i]') do
|
||||
without_tag('option[selected=selected]')
|
||||
end
|
||||
output.should have_tag('select[id=person_birth_date_and_time_6i]') do
|
||||
without_tag('option[selected=selected]')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -21,27 +21,93 @@ describe ValidatesTimeliness::ActiveRecord::MultiparameterAttributes do
|
||||
end
|
||||
|
||||
describe "execute_callstack_for_multiparameter_attributes" do
|
||||
before do
|
||||
@callstack = {
|
||||
'birth_date_and_time' => [2000,2,1,9,10,11],
|
||||
'birth_date' => [2000,2,1,9,10,11],
|
||||
'birth_time' => [2000,2,1,9,10,11]
|
||||
}
|
||||
|
||||
describe "for valid values" do
|
||||
before do
|
||||
@callstack = {
|
||||
'birth_date_and_time' => [2000,2,1,9,10,11],
|
||||
'birth_date' => [2000,2,1,9,10,11],
|
||||
'birth_time' => [2000,2,1,9,10,11]
|
||||
}
|
||||
end
|
||||
|
||||
it "should store datetime string for datetime column" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 09:10:11")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
end
|
||||
|
||||
it "should store date string for a date column" do
|
||||
obj.should_receive(:birth_date=).once.with("2000-02-01")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
end
|
||||
|
||||
it "should store time string for a time column" do
|
||||
obj.should_receive(:birth_time=).once.with("09:10:11")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
end
|
||||
end
|
||||
|
||||
it "should store datetime string for datetime column" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 09:10:11")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
describe "for invalid values" do
|
||||
before do
|
||||
@callstack = {
|
||||
'birth_date_and_time' => [2000,13,1,9,10,11],
|
||||
'birth_date' => [2000,2,41,9,10,11],
|
||||
'birth_time' => [2000,2,1,25,10,11]
|
||||
}
|
||||
end
|
||||
|
||||
it "should store invalid datetime string for datetime column" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with("2000-13-01 09:10:11")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
end
|
||||
|
||||
it "should store invalid date string for a date column" do
|
||||
obj.should_receive(:birth_date=).once.with("2000-02-41")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
end
|
||||
|
||||
it "should store invalid time string for a time column" do
|
||||
obj.should_receive(:birth_time=).once.with("25:10:11")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
end
|
||||
end
|
||||
|
||||
it "should store date string for a date column" do
|
||||
obj.should_receive(:birth_date=).once.with("2000-02-01")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
end
|
||||
describe "for missing values" do
|
||||
it "should store nil if all datetime values nil" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with(nil)
|
||||
callstack = { 'birth_date_and_time' => [nil,nil,nil,nil,nil,nil] }
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
||||
end
|
||||
|
||||
it "should store time string for a time column" do
|
||||
obj.should_receive(:birth_time=).once.with("09:10:11")
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
||||
it "should store nil year as empty value in string" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with("-02-01 09:10:11")
|
||||
callstack = { 'birth_date_and_time' => [nil,2,1,9,10,11] }
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
||||
end
|
||||
|
||||
it "should store nil month as empty value in string" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with("2000--01 09:10:11")
|
||||
callstack = { 'birth_date_and_time' => [2000,nil,1,9,10,11] }
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
||||
end
|
||||
|
||||
it "should store nil day as empty value in string" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with("2000-02- 09:10:11")
|
||||
callstack = { 'birth_date_and_time' => [2000,2,nil,9,10,11] }
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
||||
end
|
||||
|
||||
it "should store nil hour as empty value in string" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 :10:11")
|
||||
callstack = { 'birth_date_and_time' => [2000,2,1,nil,10,11] }
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
||||
end
|
||||
|
||||
it "should store nil minute as empty value in string" do
|
||||
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 09:10:")
|
||||
callstack = { 'birth_date_and_time' => [2000,2,1,9,10,nil] }
|
||||
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -47,6 +47,8 @@ end
|
||||
require 'validates_timeliness'
|
||||
require 'validates_timeliness/matcher'
|
||||
|
||||
ValidatesTimeliness.enable_datetime_select_extension!
|
||||
|
||||
ActiveRecord::Migration.verbose = false
|
||||
ActiveRecord::Base.establish_connection({:adapter => 'sqlite3', :database => ':memory:'})
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user