Module: ActiveAttr::AttributeDefaults

Extended by:
ActiveSupport::Concern
Includes:
Attributes, ChainableInitialization
Included in:
Model
Defined in:
lib/active_attr/attribute_defaults.rb

Overview

AttributeDefaults allows defaults to be declared for your attributes

Defaults are declared by passing the :default option to the attribute class method. If you need the default to be dynamic, pass a lambda, Proc, or any object that responds to #call as the value to the :default option and the result will calculated on initialization. These dynamic defaults can depend on the values of other attributes when those attributes are assigned using MassAssignment or BlockInitialization.

Examples:

Usage

class Person
  include ActiveAttr::AttributeDefaults

  attribute :first_name, :default => "John"
  attribute :last_name, :default => "Doe"
end

person = Person.new
person.first_name #=> "John"
person.last_name #=> "Doe"

Dynamic Default

class Event
  include ActiveAttr::MassAssignment
  include ActiveAttr::AttributeDefaults

  attribute :start_date
  attribute :end_date, :default => lambda { start_date }
end

event = Event.new(:start_date => Date.parse("2012-01-01"))
event.end_date.to_s #=> "2012-01-01"

Since:

  • 0.5.0

Instance Method Summary collapse

Methods included from Attributes

#==, #attributes, filter_attributes, filter_attributes=, #inspect, #read_attribute, #write_attribute

Instance Method Details

#apply_defaults(defaults = attribute_defaults) ⇒ Object

Applies the attribute defaults

Applies all the default values to any attributes not yet set, avoiding any attribute setter logic, such as dirty tracking.

Examples:

Usage

class Person
  include ActiveAttr::AttributeDefaults

  attribute :first_name, :default => "John"

  def reset!
    @attributes = {}
    apply_defaults
  end
end

person = Person.new(:first_name => "Chris")
person.reset!
person.first_name #=> "John"

Parameters:

  • defaults (Hash{String => Object}, #each) (defaults to: attribute_defaults)

    The defaults to apply

Since:

  • 0.5.0



70
71
72
73
74
75
76
# File 'lib/active_attr/attribute_defaults.rb', line 70

def apply_defaults(defaults=attribute_defaults)
  @attributes ||= {}
  defaults.each do |name, value|
    # instance variable is used here to avoid any dirty tracking in attribute setter methods
    @attributes[name] = value unless @attributes.has_key? name
  end
end

#attribute_defaultsHash{String => Object}

Calculates the attribute defaults from the attribute definitions

Examples:

Usage

class Person
  include ActiveAttr::AttributeDefaults

  attribute :first_name, :default => "John"
end

Person.new.attribute_defaults #=> {"first_name"=>"John"}

Returns:

  • (Hash{String => Object})

    the attribute defaults

Since:

  • 0.5.0



92
93
94
# File 'lib/active_attr/attribute_defaults.rb', line 92

def attribute_defaults
  attributes_map { |name| _attribute_default name }
end

#initializeObject

Applies attribute default values

Since:

  • 0.5.0



99
100
101
102
# File 'lib/active_attr/attribute_defaults.rb', line 99

def initialize(*)
  super
  apply_defaults
end