lib/simple_model/attributes.rb in simple_model-1.2.25 vs lib/simple_model/attributes.rb in simple_model-1.2.26
- old
+ new
@@ -37,15 +37,19 @@
alias :set_attributes :set
def set_attribute(attr,val)
options = self.class.defined_attributes[attr] || {}
if allow_attribute_action?(val,options)
- val = fetch_default_value(options[:default]) if (!options[:allow_blank] && options.key?(:default) && val.blank?)
- val = options[:on_set].call(self,val) if options[:on_set] #(!options.key?(:on_set) || (val.blank? && !options[:allow_blank]) )
- send("#{attr}_will_change!") if (initialized?(attr) && val != attributes[attr])
- attributes[attr] = val
- options[:after_set].call(self,val) if options[:after_set]
+ allow_blank = options[:allow_blank]
+ default = options[:default]
+ val = fetch_default_value(default) if (!allow_blank && default && val.blank?)
+ unless (val.blank? && !allow_blank)
+ val = options[:on_set].call(self,val) if options.key?(:on_set)
+ send("#{attr}_will_change!") if (initialized?(attr) && val != attributes[attr])
+ attributes[attr] = val
+ options[:after_set].call(self,val) if options[:after_set]
+ end
end
end
def get_attribute(attr)
val = attributes[attr]
@@ -134,27 +138,29 @@
get_attribute(attr)
end
module ClassMethods
DEFAULT_ATTRIBUTE_SETTINGS = {:attributes_method => :attributes,
- :allow_blank => true,
+ :allow_blank => false,
:initialize => true
}.freeze
AVAILABLE_ATTRIBUTE_METHODS = {
- :has_attribute => {:alias => :has_attributes},
- :has_boolean => {:cast_to => :to_b, :alias => :has_booleans},
+ :has_attribute => {:alias => :has_attributes, :options => {:allow_blank => true}},
+ :has_boolean => {:cast_to => :to_b, :alias => :has_booleans, :options => {:allow_blank => true}},
:has_currency => {:cast_to => :to_d, :alias => :has_currencies},
:has_date => {:cast_to => :to_date, :alias => :has_dates} ,
:has_decimal => {:cast_to => :to_d, :alias => :has_decimals},
:has_float => {:cast_to => :to_f, :alias => :has_floats},
:has_int => {:cast_to => :to_i, :alias => :has_ints},
:has_time => {:cast_to => :to_time, :alias => :has_times}
}.freeze
AVAILABLE_ATTRIBUTE_METHODS.each do |method,method_options|
define_method(method) do |*attributes|
- options = default_attribute_settings.merge(attributes.extract_options!)
+ options = attributes.extract_options!
+ options = method_options[:options].merge(options) if method_options[:options]
+ options = default_attribute_settings.merge(options)
options[:on_set] = lambda {|obj,val| val.send(method_options[:cast_to]) } if method_options[:cast_to]
create_attribute_methods(attributes,options)
end
module_eval("alias #{method_options[:alias]} #{method}")
end