Module: LeanMotion::Model

Defined in:
lib/lean_motion/model.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

RESERVED_KEYS =
[:objectId, :createdAt, :updatedAt]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/lean_motion/model.rb', line 17

def method_missing(method, *args, &block)
  method = method.to_sym
  setter = false
  
  if setter?(method)
    setter = true
    method = method.split("=")[0].to_sym
  end

  # Setters
  if RESERVED_KEYS.include?(method) && setter
    return self.AVObject.send("#{method}=", args)
  elsif fields.include?(method) && setter
    return setField(method, args.first)
  # Getters
  elsif RESERVED_KEYS.include?(method)
    return self.AVObject.send(method)
  elsif fields.include? method
    return getField(method)
  elsif self.AVObject.respond_to?("#{method}=")
    return self.AVObject.send("#{method}=", *args, &block)
  elsif self.AVObject.respond_to?(method)
    return self.AVObject.send(method, *args, &block)
  else
    super
  end
end

Instance Attribute Details

#AVObjectObject

Returns the value of attribute AVObject.



3
4
5
# File 'lib/lean_motion/model.rb', line 3

def AVObject
  @AVObject
end

#errorsObject

Returns the value of attribute errors.



3
4
5
# File 'lib/lean_motion/model.rb', line 3

def errors
  @errors
end

Class Method Details

.included(base) ⇒ Object



317
318
319
# File 'lib/lean_motion/model.rb', line 317

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#after_deleteObject



169
# File 'lib/lean_motion/model.rb', line 169

def after_delete; end

#after_saveObject



142
# File 'lib/lean_motion/model.rb', line 142

def after_save; end

#attributesHash

Returns all of the attributes of the Model

Returns:

  • (Hash)

    attributes of Model



94
95
96
97
98
99
100
# File 'lib/lean_motion/model.rb', line 94

def attributes
  attributes = {}
  fields.each do |f|
    attributes[f] = getField(f)
  end
  @attributes = attributes
end

#attributes=(attrs) ⇒ Hash

Note:

will throw an error if a key is invalid

Sets the attributes of the Model

Parameters:

  • attrs (Hash)

    to set on the Model

Returns:

  • (Hash)

    that you gave it



107
108
109
110
111
112
113
114
115
116
117
# File 'lib/lean_motion/model.rb', line 107

def attributes=(attrs)
  attrs.each do |k, v|
    if v.respond_to?(:each) && !v.is_a?(AVObject)
      self.attributes = v
    elsif self.respond_to? "#{k}="
      self.send("#{k}=", v) 
    else
      setField(k, v) unless k.nil?
    end
  end
end

#before_deleteObject



168
# File 'lib/lean_motion/model.rb', line 168

def before_delete; end

#before_saveObject



141
# File 'lib/lean_motion/model.rb', line 141

def before_save; end

#deleteObject



160
161
162
163
164
165
166
167
# File 'lib/lean_motion/model.rb', line 160

def delete
  deleted = false
  unless before_delete == false
    deleted = @AVObject.delete
  end
  after_delete if deleted
  deleted
end

#errorForField(field) ⇒ Object



195
196
197
# File 'lib/lean_motion/model.rb', line 195

def errorForField(field)
  @errors[field] || false
end

#fieldsObject



69
70
71
# File 'lib/lean_motion/model.rb', line 69

def fields
  self.class.send(:get_fields)
end

#getField(field) ⇒ Object



74
75
76
77
78
79
# File 'lib/lean_motion/model.rb', line 74

def getField(field)
  field = field.to_sym
  return @AVObject.send(field) if RESERVED_KEYS.include?(field)
  return @AVObject[field] if fields.include? field
  raise "AVCloud Exception: Invalid field name #{field} for object #{self.class.to_s}"
end

#getter?(method) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/lean_motion/model.rb', line 45

def getter?(method)
  !setter?(method)
end

#initialize(av = nil) ⇒ Object



7
8
9
10
11
12
13
14
15
# File 'lib/lean_motion/model.rb', line 7

def initialize(av=nil)
  if av
    self.AVObject = av
  else
    self.AVObject = AVObject.objectWithClassName(self.class.to_s)
  end

  self
end

#invalid?Boolean

Returns:

  • (Boolean)


207
208
209
# File 'lib/lean_motion/model.rb', line 207

def invalid?
  !self.valid?
end

#is_valid?Bool

Checks to see if the current Model has errors

Returns:

  • (Bool)

    true/false



154
155
156
157
158
# File 'lib/lean_motion/model.rb', line 154

def is_valid?
  self.validate
  return false if @errors && @errors.length > 0
  true
end

#presenceValidationMessagesObject



177
178
179
# File 'lib/lean_motion/model.rb', line 177

def presenceValidationMessages
  self.class.send(:get_presence_validation_messages)
end

#presenceValidationsObject

Validations



173
174
175
# File 'lib/lean_motion/model.rb', line 173

def presenceValidations
  self.class.send(:get_presence_validations)
end

#reset_errorsObject



211
212
213
# File 'lib/lean_motion/model.rb', line 211

def reset_errors
  @errors = nil
end

#respond_to?(method) ⇒ Bool

Override of ruby’s respond_to?

Parameters:

  • method (Symbol)

Returns:

  • (Bool)

    true/false



57
58
59
60
61
62
63
64
65
66
67
# File 'lib/lean_motion/model.rb', line 57

def respond_to?(method)
  if setter?(method)
    method = method.to_s.split("=")[0]
  end

  method = method.to_sym unless method.is_a? Symbol

  return true if fields.include?(method)

  super
end

#saveBool

Note:

calls before/after_save hooks

Note:

before_save MUST return true, or save will not be called on AVObject

Note:

does not save if validations fail

Save the current state of the Model to Parse

Returns:

  • (Bool)

    true/false



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/lean_motion/model.rb', line 126

def save
  saved = false
  unless before_save == false
    self.validate

    if @errors && @errors.length > 0
      saved = false
    else
      saved = @AVObject.save
    end

    after_save if saved
  end
  saved
end

#setField(field, value) ⇒ Object



81
82
83
84
85
86
87
88
89
# File 'lib/lean_motion/model.rb', line 81

def setField(field, value)
  if RESERVED_KEYS.include?(field) || fields.include?(field.to_sym)
    return @AVObject.removeObjectForKey(field.to_s) if value.nil?
    return @AVObject.send("#{field}=", value) if RESERVED_KEYS.include?(field)
    return @AVObject[field] = value
  else
    raise "AVCloud Exception: Invalid field name #{field} for object #{self.class.to_s}"
  end
end

#setter?(method) ⇒ Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/lean_motion/model.rb', line 49

def setter?(method)
  method.to_s.include?("=")
end

#valid?Boolean

Returns:

  • (Boolean)


203
204
205
# File 'lib/lean_motion/model.rb', line 203

def valid?
  self.errors.nil? || self.errors.length == 0
end

#validateObject



144
145
146
147
148
149
# File 'lib/lean_motion/model.rb', line 144

def validate
  reset_errors
  self.attributes.each do |field, value|
    validateField field, value
  end
end

#validateField(field, value) ⇒ Object



183
184
185
186
187
188
189
190
191
192
193
# File 'lib/lean_motion/model.rb', line 183

def validateField(field, value)
  @errors ||= {}
  if presenceValidations.include?(field) && (value.nil? || value == "")
    messages = presenceValidationMessages
    if messages.include?(field) 
      @errors[field] = messages[field]
    else
      @errors[field] = "#{field} can't be blank" 
    end
  end
end