timezone_field 1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/timezone_field.rb +51 -0
- metadata +78 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'active_support'
|
3
|
+
|
4
|
+
module TimezoneField
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
class ZoneValidator < ActiveModel::Validator
|
8
|
+
def validate(record)
|
9
|
+
record.class.timezone_fields.each do |tz_field|
|
10
|
+
value = record.send(:read_attribute, tz_field)
|
11
|
+
if value.present?
|
12
|
+
record.errors[tz_field.to_sym] << 'Unrecognized timezone' if ActiveSupport::TimeZone[value].nil?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
def has_timezone_field(field_name)
|
20
|
+
self.timezone_fields ||= []
|
21
|
+
self.timezone_fields << field_name
|
22
|
+
define_timezone_accessors(field_name)
|
23
|
+
end
|
24
|
+
|
25
|
+
def define_timezone_accessors(field_name)
|
26
|
+
define_method(:"#{field_name}") do
|
27
|
+
mapping = ActiveSupport::TimeZone::MAPPING
|
28
|
+
zone_str = read_attribute(field_name)
|
29
|
+
if mapping.has_key?(zone_str)
|
30
|
+
rails_zone_identifier = zone_str
|
31
|
+
else
|
32
|
+
rails_zone_identifier = mapping.invert[zone_str] || Time.zone.name
|
33
|
+
end
|
34
|
+
ActiveSupport::TimeZone[rails_zone_identifier]
|
35
|
+
end
|
36
|
+
define_method(:"#{field_name}=") do |tz|
|
37
|
+
zone = tz && ActiveSupport::TimeZone[tz]
|
38
|
+
if zone
|
39
|
+
write_attribute(field_name, zone.tzinfo.name)
|
40
|
+
else
|
41
|
+
write_attribute(field_name, tz) # This will produce a validation error when you try to save
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
included do
|
48
|
+
class_attribute :timezone_fields
|
49
|
+
validates_with ZoneValidator
|
50
|
+
end
|
51
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: timezone_field
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.0'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Victor Lin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: active_record
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: active_support
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: Stores timezones as standard TZInfo identifiers and handles conversion
|
47
|
+
to/from Rails-friendly timezones
|
48
|
+
email: victor@wellnessfx.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- lib/timezone_field.rb
|
54
|
+
homepage: ''
|
55
|
+
licenses: []
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 1.8.24
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: Rails-friendly timezone field
|
78
|
+
test_files: []
|