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
-
#clear_server_errors(key) ⇒ Object
When a field is changed, we want to clear any errors from the server.
-
#error_in_changed_attributes? ⇒ Boolean
Returns true if any of the changed fields now has an error.
- #errors(marked_only = false) ⇒ Object
-
#mark_all_fields! ⇒ Object
Marks all fields, useful for when a model saves.
-
#mark_field!(field_name) ⇒ Object
Once a field is ready, we can use include_in_errors! to start showing its errors.
- #marked_errors ⇒ Object
- #marked_fields ⇒ Object
-
#server_errors ⇒ Object
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!.
-
#validate(field_name = nil, options = nil, &block) ⇒ Object
Called on the model inside of a validations block.
-
#validate! ⇒ Object
TODO: Errors is being called for any validation change.
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
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_errors ⇒ Object
112 113 114 |
# File 'lib/volt/models/validations/validations.rb', line 112 def marked_errors errors(true) end |
#marked_fields ⇒ Object
88 89 90 |
# File 'lib/volt/models/validations/validations.rb', line 88 def marked_fields @marked_fields ||= ReactiveHash.new end |
#server_errors ⇒ Object
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, = nil, &block) if block # Setup a custom validation inside of the current validations block. if field_name || 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!() 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 |