lib/mongoid/i18n.rb in mongoid_i18n-0.3.1 vs lib/mongoid/i18n.rb in mongoid_i18n-0.4.0

- old
+ new

@@ -9,11 +9,11 @@ module I18n extend ActiveSupport::Concern module ClassMethods def localized_field(name, options = {}) - field name, options.merge(:type => LocalizedField, :default => LocalizedField.new) + field name, options.merge(:type => LocalizedField, :default => {}) end def validates_default_locale(names, options = {}) validates_with LocalizedValidator, options.merge(:mode => :only_default, :attributes => names) end @@ -26,33 +26,39 @@ validates_with LocalizedValidator, options.merge(:mode => :all_locales, :attributes => names) end protected def create_accessors(name, meth, options = {}) - if options[:type] == LocalizedField - if options[:use_default_if_empty] - define_method(meth) { read_attribute(name)[::I18n.locale.to_s] || read_attribute(name)[::I18n.default_locale.to_s] rescue ''} - else - define_method(meth) { read_attribute(name)[::I18n.locale.to_s] rescue '' } - end + # Let Mongoid do all stuff + super + + # Skip if create_accessors called on non LocalizedField field + return if LocalizedField != options[:type] + + # Get field to retain incapsulation of LocalizedField class + field = fields[name] + + generated_field_methods.module_eval do + + # Redefine writer method, since it's impossible to correctly implement + # = method on field itself define_method("#{meth}=") do |value| - value = if value.is_a?(Hash) - (@attributes[name] || {}).merge(value) - else - (@attributes[name] || {}).merge(::I18n.locale.to_s => value) - end - value = value.delete_if { |key, value| value.blank? } if options[:clear_empty_values] - write_attribute(name, value) + hash = field.assign(read_attribute(name), value) + write_attribute(name, hash) end - define_method("#{meth}_translations") { read_attribute(name) } - if options[:clear_empty_values] - define_method("#{meth}_translations=") { |value| write_attribute(name, value.delete_if { |key, value| value.blank? }) } - else - define_method("#{meth}_translations=") { |value| write_attribute(name, value) } + + # Return list of attribute translations + define_method("#{meth}_translations") do + field.to_hash(read_attribute(name)) end - else - super + + # Mass-assign translations + define_method("#{meth}_translations=") do |values| + hash = field.replace(read_attribute(name), values) + write_attribute(name, hash) + end end + end end end end \ No newline at end of file