Module: SimpleModel::Attributes::ClassMethods

Defined in:
lib/simple_model/attributes.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#after_initializeObject

Returns the value of attribute after_initialize.



237
238
239
# File 'lib/simple_model/attributes.rb', line 237

def after_initialize
  @after_initialize
end

#alias_attributesObject



268
269
270
# File 'lib/simple_model/attributes.rb', line 268

def alias_attributes
  @alias_attributes ||= Hash.new
end

#before_initializeObject

Returns the value of attribute before_initialize.



237
238
239
# File 'lib/simple_model/attributes.rb', line 237

def before_initialize
  @before_initialize
end

#configObject

The current intent of the config is allow the managing of features at the global level and overrides options set at attribute definition, which may not be the most flexible and may require re-thinking for future options Options:

  • config.initialize_defaults default is true, if false prevents attributes with default values from auto-initializing



284
285
286
# File 'lib/simple_model/attributes.rb', line 284

def config
  @config ||= (superclass.respond_to?(:config) ? superclass.config.dup : SimpleModel.config.dup)
end

#default_attribute_settingsObject

The default settings for a SimpeModel class Options:

  • :on_set - accepts a lambda that is run when an attribute is set

  • :on_get - accepts a lambda that is run when you get/read an attribute

  • :default - the default value for the attribute, can be a symbol that is sent for a method

  • :initialize - informations the object whether or not it should initialize the attribute with :default value, defaults to true,

    and is overridden by config.initialzie_defaults
    

** If :initialize is set to false you must set :allow_blank to false or it will never set the default value

  • :allow_blank - when set to false, if an attributes value is blank attempts to set the default value, defaults to true



297
298
299
# File 'lib/simple_model/attributes.rb', line 297

def default_attribute_settings
  @default_attribute_settings ||= DEFAULT_ATTRIBUTE_SETTINGS
end

#defined_attributesObject



272
273
274
# File 'lib/simple_model/attributes.rb', line 272

def defined_attributes
  @defined_attributes ||= Hash.new
end

Instance Method Details

#add_defined_attribute(attr, options) ⇒ Object

We want to re-run define_attribute_methods since attributes are not all defined at once, so we must set @attribute_methods_generated to nil to allow the re-run to occur ONLY IN RAILS 3.0.



304
305
306
307
308
# File 'lib/simple_model/attributes.rb', line 304

def add_defined_attribute(attr,options)
  defined_attributes[attr] = options
  @attribute_methods_generated = nil #if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR == 0)
  define_attribute_methods(defined_attributes_keys)
end

#alias_attribute(new_alias, attr) ⇒ Object

Creates alias setter and getter for the supplied attribute using the supplied alias See spec for example.

Raises:



349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
# File 'lib/simple_model/attributes.rb', line 349

def alias_attribute(new_alias,attr)

  # get to the base attribute
  while alias_attributes[attr]
    attr = alias_attributes[attr]
  end

  raise UndefinedAttribute, "#{attr} is not a defined attribute so it cannot be aliased" unless defined_attributes[attr]

  alias_attributes[new_alias] = attr

  define_method(new_alias) do
    send(attr)
  end
  define_method("#{new_alias}?") do
    send("#{attr}?")
  end
  define_method("#{new_alias}=") do |*args, &block|
    send("#{attr}=",*args, &block)
  end
end

#attribute_defined?(attr) ⇒ Boolean

Returns:

  • (Boolean)


276
277
278
# File 'lib/simple_model/attributes.rb', line 276

def attribute_defined?(attr)
  defined_attributes.has_key?(attr.to_sym)
end

#create_attribute_methods(attrs, options) ⇒ Object

builds the setter and getter methods



318
319
320
321
322
323
324
325
326
# File 'lib/simple_model/attributes.rb', line 318

def create_attribute_methods(attrs,options)
  unless attrs.blank?
    attrs.each do |attr|
      define_setter_with_options(attr,options)
      define_reader_with_options(attr,options)
      add_defined_attribute(attr,options)
    end
  end
end

#define_reader_with_options(attr, options) ⇒ Object



328
329
330
331
332
333
334
335
336
# File 'lib/simple_model/attributes.rb', line 328

def define_reader_with_options(attr,options)
  define_method(attr) do
    get_attribute(attr,options)
  end

  define_method("#{attr}?") do
    get_attribute?(attr)
  end
end

#define_setter_with_options(attr, options) ⇒ Object

Creates setter methods for the provided attributes On set, it will mark the attribute as changed if the attributes has been initialized.



341
342
343
344
345
# File 'lib/simple_model/attributes.rb', line 341

def define_setter_with_options(attr,options)
  define_method("#{attr}=") do |val|
    set_attribute(attr,val,options)
  end
end

#defined_attributes_keysObject

We don’t want to call define_attribute_methods on methods defined in the parent class



311
312
313
314
315
# File 'lib/simple_model/attributes.rb', line 311

def defined_attributes_keys
  dak = defined_attributes.keys
  dak = dak - superclass.defined_attributes.keys if superclass.respond_to?(:defined_attributes)
  dak
end

#inherited(base) ⇒ Object

Must inherit super’s defined_attributes and alias_attributes



390
391
392
393
394
# File 'lib/simple_model/attributes.rb', line 390

def inherited(base)
  base.defined_attributes = defined_attributes.merge(base.defined_attributes)
  base.alias_attributes = alias_attributes.merge(base.alias_attributes)
  super
end

#new_with_store(session_hash) ⇒ Object

Creates a new instance where the attributes store is set to object provided, which allows one to pass a session store hash or any other hash-like object to be used for persistence. Typically used for modeling session stores for authorization or shopping carts EX:

class ApplicationController < ActionController::Base
  def session_user
    session[:user] ||= {}
    @session_user ||= SessionUser.new_with_store(session[:user])
  end
  helper_method :session_user
end


264
265
266
# File 'lib/simple_model/attributes.rb', line 264

def new_with_store(session_hash)
  self.new(:attributes => session_hash)
end