Module: Volt::Validations

Included in:
Model
Defined in:
lib/volt/models/validations/validations.rb

Overview

Include in any class to get validation logic

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



77
78
79
80
# File 'lib/volt/models/validations/validations.rb', line 77

def self.included(base)
  base.send :extend, ClassMethods
  base.class_attribute(:custom_validations, :validations_to_run)
end

Instance Method Details

#clear_server_errors(key) ⇒ Object

When a field is changed, we want to clear any errors from the server



124
125
126
# File 'lib/volt/models/validations/validations.rb', line 124

def clear_server_errors(key)
  @server_errors.delete(key)
end

#error_in_changed_attributes?Boolean

Returns true if any of the changed fields now has an error

Returns:

  • (Boolean)

    true if one of the changed fields has an error.



161
162
163
164
165
166
167
168
169
170
# File 'lib/volt/models/validations/validations.rb', line 161

def error_in_changed_attributes?
  errs = errors

  changed_attributes.each_pair do |key, _|
    # If any of the fields with errors are also the ones that were
    return true if errs[key]
  end

  false
end

#errors(marked_only = false) ⇒ Object



128
129
130
131
132
133
134
135
136
137
# File 'lib/volt/models/validations/validations.rb', line 128

def errors(marked_only = false)
  @errors ||= Errors.new

  if marked_only
    # Only return the fields that have been marked
    @errors.to_h.select { |key, _| marked_fields[key] }
  else
    @errors
  end
end

#mark_all_fields!Object

Marks all fields, useful for when a model saves.



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/volt/models/validations/validations.rb', line 93

def mark_all_fields!
  # TODO: We can use a Set here, but set was having issues.  Check in a
  # later version of opal.
  fields_to_mark = []

  # Look at each validation
  validations = self.class.validations_to_run
  if validations
    fields_to_mark += validations.keys
  end

  # Also include any current fields
  fields_to_mark += attributes.keys

  fields_to_mark.each do |key|
    mark_field!(key.to_sym)
  end
end

#mark_field!(field_name) ⇒ Object

Once a field is ready, we can use include_in_errors! to start showing its errors.



84
85
86
# File 'lib/volt/models/validations/validations.rb', line 84

def mark_field!(field_name)
  marked_fields[field_name] = true
end

#marked_errorsObject



112
113
114
# File 'lib/volt/models/validations/validations.rb', line 112

def marked_errors
  errors(true)
end

#marked_fieldsObject



88
89
90
# File 'lib/volt/models/validations/validations.rb', line 88

def marked_fields
  @marked_fields ||= ReactiveHash.new
end

#server_errorsObject

server errors are errors that come back from the server when we save! Any changes to the associated fields will clear the error until another save!



119
120
121
# File 'lib/volt/models/validations/validations.rb', line 119

def server_errors
  @server_errors ||= ReactiveHash.new
end

#validate(field_name = nil, options = nil, &block) ⇒ Object

Called on the model inside of a validations block. Allows the user to control if validations should be run.



64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/volt/models/validations/validations.rb', line 64

def validate(field_name = nil, options = nil, &block)
  if block
    # Setup a custom validation inside of the current validations block.
    if field_name || options
      fail 'validate should be passed a field name and options or a block, not both.'
    end
    @instance_custom_validations << block
  else
    @instance_validations[field_name] ||= {}
    @instance_validations[field_name].merge!(options)
  end
end

#validate!Object

TODO: Errors is being called for any validation change. We should have errors return a hash like object that only calls the validation for each one.



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/volt/models/validations/validations.rb', line 141

def validate!
  errors.clear

  # Run the before_validate callbacks
  run_callbacks(:before_validate).then do
    # Run the actual validations
    run_validations
  end.then do
    # See if any server errors are in place and merge them in if they are
    errors.merge!(server_errors.to_h) if Volt.client?
  end.then do
    run_custom_validations
  end.then do
    # Return the errors object
    errors
  end
end