Module: SimpleModel::Attributes::ClassMethods
- Defined in:
- lib/simple_model/attributes.rb
Constant Summary collapse
- DEFAULT_ATTRIBUTE_SETTINGS =
{:attributes_method => :attributes, :allow_blank => true, :initialize => true }.freeze
- AVAILABLE_ATTRIBUTE_METHODS =
{ :has_attribute => {:alias => :has_attributes}, :has_boolean => {:cast_to => :to_b, :alias => :has_booleans}, :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
Instance Method Summary collapse
-
#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.
-
#after_initialize ⇒ Object
A hook to perform actions after all attributes have been initialized Expects an lambda that accept the object and the pending attributes hash EX: lambda {|obj| puts “initialized”}.
-
#after_initialize=(after_initialize) ⇒ Object
Expects an lambda that accept the object and the pending attributes hash EX: lambda {|obj| puts “initialized”}.
-
#alias_attribute(new_alias, attr) ⇒ Object
Creates alias setter and getter for the supplied attribute using the supplied alias See spec for example.
- #alias_attributes ⇒ Object
- #alias_attributes=(alias_attributes) ⇒ Object
- #attribute_defined?(attr) ⇒ Boolean
-
#before_initialize ⇒ Object
A hook to perform actions on the pending attributes or the object before the pending attributes have been initialized.
-
#before_initialize=(before_initialize) ⇒ Object
Expects an lambda that accept the object, the pending attributes hash and should return a hash to be set EX: lambda {|obj,attrs| attrs.select{|k,v| !v.blank?}}.
-
#create_attribute_methods(attributes, options) ⇒ Object
builds the setter and getter methods.
-
#default_attribute_settings ⇒ Object
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 ** 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.
- #default_attribute_settings=(default_attribute_settings) ⇒ Object
- #define_reader_with_options(attr, options) ⇒ Object
-
#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.
- #defined_attributes ⇒ Object
- #defined_attributes=(defined_attributes) ⇒ Object
-
#defined_attributes_keys ⇒ Object
We don’t want to call define_attribute_methods on methods defined in the parent class.
-
#inherited(base) ⇒ Object
Must inherit super’s defined_attributes and alias_attributes Rails 3.0 does some weird stuff with ActiveModel::Dirty so we need a hack to keep things working when a class inherits from a super that has ActiveModel::Dirty included.
-
#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.
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.
222 223 224 225 226 |
# File 'lib/simple_model/attributes.rb', line 222 def add_defined_attribute(attr,) defined_attributes[attr] = @attribute_methods_generated = nil #if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR == 0) define_attribute_methods(defined_attributes_keys) end |
#after_initialize ⇒ Object
A hook to perform actions after all attributes have been initialized Expects an lambda that accept the object and the pending attributes hash EX: lambda {|obj| puts “initialized”}
308 309 310 |
# File 'lib/simple_model/attributes.rb', line 308 def after_initialize @after_initialize end |
#after_initialize=(after_initialize) ⇒ Object
Expects an lambda that accept the object and the pending attributes hash EX: lambda {|obj| puts “initialized”}
314 315 316 317 |
# File 'lib/simple_model/attributes.rb', line 314 def after_initialize=after_initialize raise TypeError "after_initalize must be a Proc" unless after_initialize.is_a?(Proc) @after_initialize = after_initialize end |
#alias_attribute(new_alias, attr) ⇒ Object
Creates alias setter and getter for the supplied attribute using the supplied alias See spec for example.
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 |
# File 'lib/simple_model/attributes.rb', line 266 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 |
#alias_attributes ⇒ Object
183 184 185 |
# File 'lib/simple_model/attributes.rb', line 183 def alias_attributes @alias_attributes ||= HashWithIndifferentAccess.new end |
#alias_attributes=(alias_attributes) ⇒ Object
187 188 189 |
# File 'lib/simple_model/attributes.rb', line 187 def alias_attributes=alias_attributes @alias_attributes = alias_attributes end |
#attribute_defined?(attr) ⇒ Boolean
199 200 201 |
# File 'lib/simple_model/attributes.rb', line 199 def attribute_defined?(attr) defined_attributes.key?(attr) end |
#before_initialize ⇒ Object
A hook to perform actions on the pending attributes or the object before the pending attributes have been initialized. Expects an lambda that accept the object, the pending attributes hash and should return a hash to be set EX: lambda {|obj,attrs| attrs.select{|k,v| !v.blank?}}
293 294 295 |
# File 'lib/simple_model/attributes.rb', line 293 def before_initialize @before_initialize end |
#before_initialize=(before_initialize) ⇒ Object
Expects an lambda that accept the object, the pending attributes hash and should return a hash to be set EX: lambda {|obj,attrs| attrs.select{|k,v| !v.blank?}}
300 301 302 303 |
# File 'lib/simple_model/attributes.rb', line 300 def before_initialize=before_initialize raise TypeError "before_initialize must be a lambda that accepts the attributes to be initialize" unless before_initialize.is_a?(Proc) @before_initialize = before_initialize end |
#create_attribute_methods(attributes, options) ⇒ Object
builds the setter and getter methods
236 237 238 239 240 241 242 243 244 |
# File 'lib/simple_model/attributes.rb', line 236 def create_attribute_methods(attributes,) unless attributes.blank? attributes.each do |attr| (attr,) (attr,) add_defined_attribute(attr,) end end end |
#default_attribute_settings ⇒ Object
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
** 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
211 212 213 |
# File 'lib/simple_model/attributes.rb', line 211 def default_attribute_settings @default_attribute_settings ||= DEFAULT_ATTRIBUTE_SETTINGS end |
#default_attribute_settings=(default_attribute_settings) ⇒ Object
215 216 217 |
# File 'lib/simple_model/attributes.rb', line 215 def default_attribute_settings=default_attribute_settings @default_attribute_settings = default_attribute_settings end |
#define_reader_with_options(attr, options) ⇒ Object
246 247 248 249 250 251 252 253 |
# File 'lib/simple_model/attributes.rb', line 246 def (attr,) define_method(attr) do get_attribute(attr) 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.
258 259 260 261 262 |
# File 'lib/simple_model/attributes.rb', line 258 def (attr,) define_method("#{attr}=") do |val| set_attribute(attr,val) end end |
#defined_attributes ⇒ Object
191 192 193 |
# File 'lib/simple_model/attributes.rb', line 191 def defined_attributes @defined_attributes ||= HashWithIndifferentAccess.new end |
#defined_attributes=(defined_attributes) ⇒ Object
195 196 197 |
# File 'lib/simple_model/attributes.rb', line 195 def defined_attributes=defined_attributes @defined_attributes = defined_attributes end |
#defined_attributes_keys ⇒ Object
We don’t want to call define_attribute_methods on methods defined in the parent class
229 230 231 232 233 |
# File 'lib/simple_model/attributes.rb', line 229 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 Rails 3.0 does some weird stuff with ActiveModel::Dirty so we need a hack to keep things working when a class inherits from a super that has ActiveModel::Dirty included
323 324 325 326 327 328 329 330 331 332 |
# File 'lib/simple_model/attributes.rb', line 323 def inherited(base) base.defined_attributes = defined_attributes.merge(base.defined_attributes) base.alias_attributes = alias_attributes.merge(base.alias_attributes) super # Rails 3.0 Hack if (ActiveModel::VERSION::MAJOR == 3 && ActiveModel::VERSION::MINOR == 0) base.attribute_method_suffix '_changed?', '_change', '_will_change!', '_was' base.attribute_method_affix :prefix => 'reset_', :suffix => '!' end 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
176 177 178 179 180 181 |
# File 'lib/simple_model/attributes.rb', line 176 def new_with_store(session_hash) nw = self.new() nw.attributes = session_hash nw.set(nw.send(:attributes_for_init,session_hash)) nw end |