lib/active_record_extensions.rb
require 'i18n'
require 'active_record_extensions/time_parser'
ActiveRecord::Base.send(:include, ActiveRecordExtensions::TimeParser)
lib/active_record_extensions/time_parser.rb
module ActiveRecordExtensions
module TimeParser
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
# add your static(class) methods here
def datepicker_attributes(*args)
options = args.extract_options!
args.delete_at(-1) if args[-1].is_a?(Hash)
args.each do |arg|
column_type = self.columns_hash[arg.to_s].type
raise StandardError, "Wrong column declaration, specify a
column with date or datetime type" if column_type != :date &&
column_type != :datetime
define_method "#{arg.to_s}=" do |date|
aux_date = nil
## FIXME: NEVER ENTERS INSIDE THAT LOOP I18n.t...
I18n.t('time.datepicker_formats').values do |format|
aux_date = Time.strptime(date, format) rescue nil
break unless aux_date.nil?
end
write_attribute(arg.to_sym,aux_date || date)
end
end
end
end
end
end
config/locales/en/model:
en:
time:
datepicker_formats:
default: "%d/%m/%Y %H:%M"
config/environment.rb:
require "active_record_extensions"
bGliL2FjdGl2ZV9yZWNvcmRfZXh0ZW5zaW9ucy5yYgoKcmVxdWlyZSAnaTE4bicKcmVxdWlyZSAnYWN0aXZlX3JlY29yZF9leHRlbnNpb25zL3RpbWVfcGFyc2VyJwpBY3RpdmVSZWNvcmQ6OkJhc2Uuc2VuZCg6aW5jbHVkZSwgQWN0aXZlUmVjb3JkRXh0ZW5zaW9uczo6VGltZVBhcnNlcikKCmxpYi9hY3RpdmVfcmVjb3JkX2V4dGVuc2lvbnMvdGltZV9wYXJzZXIucmIKCm1vZHVsZSBBY3RpdmVSZWNvcmRFeHRlbnNpb25zCiAgbW9kdWxlIFRpbWVQYXJzZXIKICAgIGRlZiBzZWxmLmluY2x1ZGVkKGJhc2UpCiAgICAgIGJhc2UuZXh0ZW5kKENsYXNzTWV0aG9kcykKICAgIGVuZAogICAgbW9kdWxlIENsYXNzTWV0aG9kcwogICAgICAjIGFkZCB5b3VyIHN0YXRpYyhjbGFzcykgbWV0aG9kcyBoZXJlCiAgICAgIGRlZiBkYXRlcGlja2VyX2F0dHJpYnV0ZXMoKmFyZ3MpCiAgICAgICAgb3B0aW9ucyA9IGFyZ3MuZXh0cmFjdF9vcHRpb25zIQogICAgICAgIGFyZ3MuZGVsZXRlX2F0KC0xKSBpZiBhcmdzWy0xXS5pc19hPyhIYXNoKQogICAgICAgIGFyZ3MuZWFjaCBkbyB8YXJnfAogICAgICAgICAgY29sdW1uX3R5cGUgPSBzZWxmLmNvbHVtbnNfaGFzaFthcmcudG9fc10udHlwZQogICAgICAgICAgcmFpc2UgU3RhbmRhcmRFcnJvciwgIldyb25nIGNvbHVtbiBkZWNsYXJhdGlvbiwgc3BlY2lmeSBhIApjb2x1bW4gd2l0aCBkYXRlIG9yIGRhdGV0aW1lIHR5cGUiIGlmIGNvbHVtbl90eXBlICE9IDpkYXRlICYmIApjb2x1bW5fdHlwZSAhPSA6ZGF0ZXRpbWUKICAgICAgICAgIGRlZmluZV9tZXRob2QgIiN7YXJnLnRvX3N9PSIgZG8gfGRhdGV8CiAgICAgICAgICAgIGF1eF9kYXRlID0gbmlsCiMjIEZJWE1FOiBORVZFUiBFTlRFUlMgSU5TSURFIFRIQVQgTE9PUCBJMThuLnQuLi4KICAgICAgICAgICAgSTE4bi50KCd0aW1lLmRhdGVwaWNrZXJfZm9ybWF0cycpLnZhbHVlcyBkbyB8Zm9ybWF0fAogICAgICAgICAgICAgIGF1eF9kYXRlID0gVGltZS5zdHJwdGltZShkYXRlLCBmb3JtYXQpIHJlc2N1ZSBuaWwKICAgICAgICAgICAgICBicmVhayB1bmxlc3MgYXV4X2RhdGUubmlsPwogICAgICAgICAgICBlbmQKICAgICAgICAgICAgd3JpdGVfYXR0cmlidXRlKGFyZy50b19zeW0sYXV4X2RhdGUgfHwgZGF0ZSkKICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgICBlbmQKICAgZW5kCiAgZW5kCmVuZAoKCgpjb25maWcvbG9jYWxlcy9lbi9tb2RlbDoKCmVuOgogIHRpbWU6CiAgICBkYXRlcGlja2VyX2Zvcm1hdHM6CiAgICAgIGRlZmF1bHQ6ICIlZC8lbS8lWSAlSDolTSIKCmNvbmZpZy9lbnZpcm9ubWVudC5yYjoKCnJlcXVpcmUgImFjdGl2ZV9yZWNvcmRfZXh0ZW5zaW9ucyI=