refactored error value formats to use locale file for I18n. Rail 2.0/2.1 to use default_error_value_formats now.

moved default_error_messages_method into validator
This commit is contained in:
Adam Meehan 2009-03-28 18:49:26 +11:00
parent a836ed8434
commit 7967b5a212
6 changed files with 58 additions and 28 deletions

View File

@ -302,12 +302,22 @@ will be inserted.
And for something a little more specific you can override the format of the interpolation And for something a little more specific you can override the format of the interpolation
values inserted in the error messages for temporal restrictions like so values inserted in the error messages for temporal restrictions like so
ValidatesTimeliness::Validator.error_value_formats.update( For Rails 2.0/2.1:
ValidatesTimeliness::Validator.default_error_value_formats.update(
:time => '%H:%M:%S', :time => '%H:%M:%S',
:date => '%Y-%m-%d', :date => '%Y-%m-%d',
:datetime => '%Y-%m-%d %H:%M:%S' :datetime => '%Y-%m-%d %H:%M:%S'
) )
Rails 2.2+ using the I18n system to define new defaults:
validates_timeliness:
error_value_formats:
date: '%Y-%m-%d'
time: '%H:%M:%S'
datetime: '%Y-%m-%d %H:%M:%S'
Those are Ruby strftime formats not the plugin formats. Those are Ruby strftime formats not the plugin formats.

View File

@ -34,20 +34,14 @@ module ValidatesTimeliness
I18n.load_path += [ LOCALE_PATH ] I18n.load_path += [ LOCALE_PATH ]
I18n.reload! I18n.reload!
else else
messages = YAML::load(IO.read(LOCALE_PATH)) defaults = YAML::load(IO.read(LOCALE_PATH))['en']
errors = messages['en']['activerecord']['errors']['messages'].inject({}) {|h,(k,v)| h[k.to_sym] = v.gsub(/\{\{\w*\}\}/, '%s');h } errors = defaults['activerecord']['errors']['messages'].inject({}) {|h,(k,v)| h[k.to_sym] = v.gsub(/\{\{\w*\}\}/, '%s');h }
::ActiveRecord::Errors.default_error_messages.update(errors) ::ActiveRecord::Errors.default_error_messages.update(errors)
ValidatesTimeliness::Validator.default_error_value_formats = defaults['validates_timeliness']['error_value_formats'].symbolize_keys
end end
end end
def default_error_messages
if Rails::VERSION::STRING < '2.2'
::ActiveRecord::Errors.default_error_messages
else
I18n.translate('activerecord.errors.messages')
end
end
def setup_for_rails def setup_for_rails
self.default_timezone = ::ActiveRecord::Base.default_timezone self.default_timezone = ::ActiveRecord::Base.default_timezone
self.use_time_zones = ::ActiveRecord::Base.time_zone_aware_attributes rescue false self.use_time_zones = ::ActiveRecord::Base.time_zone_aware_attributes rescue false

View File

@ -11,3 +11,8 @@ en:
after: "must be after {{restriction}}" after: "must be after {{restriction}}"
on_or_after: "must be on or after {{restriction}}" on_or_after: "must be on or after {{restriction}}"
between: "must be between {{earliest}} and {{latest}}" between: "must be between {{earliest}} and {{latest}}"
validates_timeliness:
error_value_formats:
date: '%Y-%m-%d'
time: '%H:%M:%S'
datetime: '%Y-%m-%d %H:%M:%S'

View File

@ -116,7 +116,7 @@ module Spec
end end
def error_message_for(option) def error_message_for(option)
msg = @validator.send(:error_messages)[option] msg = @validator.error_messages[option]
restriction = @validator.class.send(:evaluate_option_value, @validator.configuration[option], @type, @record) restriction = @validator.class.send(:evaluate_option_value, @validator.configuration[option], @type, @record)
if restriction if restriction
@ -135,7 +135,7 @@ module Spec
def format_value(value) def format_value(value)
return value if value.is_a?(String) return value if value.is_a?(String)
value.strftime(ValidatesTimeliness::Validator.error_value_formats[@type]) value.strftime(@validator.class.error_value_formats[@type])
end end
end end

View File

@ -2,14 +2,9 @@ module ValidatesTimeliness
class Validator class Validator
cattr_accessor :ignore_restriction_errors cattr_accessor :ignore_restriction_errors
cattr_accessor :error_value_formats cattr_accessor :default_error_value_formats
self.ignore_restriction_errors = false self.ignore_restriction_errors = false
self.error_value_formats = {
:time => '%H:%M:%S',
:date => '%Y-%m-%d',
:datetime => '%Y-%m-%d %H:%M:%S'
}
RESTRICTION_METHODS = { RESTRICTION_METHODS = {
:equal_to => :==, :equal_to => :==,
@ -47,7 +42,11 @@ module ValidatesTimeliness
validate_restrictions(record, attr_name, value) validate_restrictions(record, attr_name, value)
end end
def error_messages
@error_messages ||= self.class.default_error_messages.merge(custom_error_messages)
end
private private
def raw_value(record, attr_name) def raw_value(record, attr_name)
@ -120,10 +119,6 @@ module ValidatesTimeliness
end end
end end
def error_messages
@error_messages ||= ValidatesTimeliness.default_error_messages.merge(custom_error_messages)
end
def custom_error_messages def custom_error_messages
@custom_error_messages ||= configuration.inject({}) {|msgs, (k, v)| @custom_error_messages ||= configuration.inject({}) {|msgs, (k, v)|
if md = /(.*)_message$/.match(k.to_s) if md = /(.*)_message$/.match(k.to_s)
@ -132,7 +127,7 @@ module ValidatesTimeliness
msgs msgs
} }
end end
def combine_date_and_time(value, record) def combine_date_and_time(value, record)
if type == :date if type == :date
date = value date = value
@ -156,6 +151,22 @@ module ValidatesTimeliness
# class methods # class methods
class << self class << self
def default_error_messages
if Rails::VERSION::STRING < '2.2'
::ActiveRecord::Errors.default_error_messages
else
I18n.translate('activerecord.errors.messages')
end
end
def error_value_formats
if defined?(I18n)
I18n.translate('validates_timeliness.error_value_formats')
else
default_error_value_formats
end
end
def evaluate_option_value(value, type, record) def evaluate_option_value(value, type, record)
case value case value
when Time, Date when Time, Date

View File

@ -554,12 +554,18 @@ describe ValidatesTimeliness::Validator do
describe "custom formats" do describe "custom formats" do
before :all do before :all do
@@formats = ValidatesTimeliness::Validator.error_value_formats custom = {
ValidatesTimeliness::Validator.error_value_formats = {
:time => '%H:%M %p', :time => '%H:%M %p',
:date => '%d-%m-%Y', :date => '%d-%m-%Y',
:datetime => '%d-%m-%Y %H:%M %p' :datetime => '%d-%m-%Y %H:%M %p'
} }
if defined?(I18n)
I18n.backend.store_translations 'en', :validates_timeliness => { :error_value_formats => custom }
else
@@formats = ValidatesTimeliness::Validator.default_error_value_formats
ValidatesTimeliness::Validator.default_error_value_formats = custom
end
end end
it "should format datetime value of restriction" do it "should format datetime value of restriction" do
@ -581,7 +587,11 @@ describe ValidatesTimeliness::Validator do
end end
after :all do after :all do
ValidatesTimeliness::Validator.error_value_formats = @@formats if defined?(I18n)
I18n.reload!
else
ValidatesTimeliness::Validator.default_error_value_formats = @@formats
end
end end
end end