validatious-on-rails 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,7 +20,14 @@ v2.blank = function blank(value) {
20
20
  */
21
21
  v2.bool = function bool(value) {
22
22
  value += '';
23
- return (value === true) || (value === 'true');
23
+ return value === 'true' || +value > 0;
24
+ };
25
+
26
+ /**
27
+ * Checks if a string is null/undefined.
28
+ */
29
+ v2.present = function present(value) {
30
+ return !(typeof value === 'undefined' || value === null);
24
31
  };
25
32
 
26
33
  /**
@@ -44,54 +51,57 @@ v2.trimField = function trimField(field) {
44
51
  /**
45
52
  * Generic validator that acts as a client-side validator/helper for remote validator responses.
46
53
  */
47
- v2.Validator.add({acceptEmpty: true, fn: function(field, value, params) { return !!params[0]; }, message: null, name: 'remote-client'});
54
+ v2.Validator.add({acceptEmpty: false, fn: function(field, value, params) { return !!params[0]; }, message: null, name: 'remote-client'});
48
55
 
49
56
  /**
50
57
  * Perform a remote validation on a given field the Validatious way, slightly modified
51
58
  */
52
- v2.Rails.performRemoteValidation = function performRemoteValidation(name, field, value, params, message) {
53
- var field_element = field.__elements[0];
54
- var url = v2.Rails.remoteValidationUrlFor(name, field_element, value, params);
55
-
56
- v2.Rails.initializeLastResult(name, field_element.id);
57
-
58
- var xmlHttpRequest = new XMLHttpRequest;
59
- xmlHttpRequest.open('GET', url, true);
60
- xmlHttpRequest.onreadystatechange = function() {
61
- if (this.readyState == XMLHttpRequest.DONE) {
62
- var validationResult = (this.responseText == 'true' || this.responseText == '1') ? true : false;
63
- v2.Rails.lastRemoteValidationResult[name][field_element.id] = validationResult;
64
- /* console.log('Validation result: ' + validationResult); */
65
-
66
- /* Get all validators for this field, except the current validator. */
67
- var fieldClasses = field_element.getAttribute('class').replace(new RegExp(name + '\w*'), '').replace(/^\s+|\s+$/g, '');
68
- var theOtherValidators = v2.html.validatorsFromString(fieldClasses);
69
-
70
- /* Make remote-client validator trigger validation failure or not. */
71
- var thisValidator = field_element.id.is('remote-client', validationResult).explain(message);
72
- v2.html.applyValidators(theOtherValidators, thisValidator);
73
- thisValidator.item.validate();
74
- };
75
- };
76
- xmlHttpRequest.send(null);
77
- return v2.Rails.lastRemoteValidationResult[name][field_element.id];
78
- };
59
+ v2.Rails.performRemoteValidation = function performRemoteValidation(name, field, value, params, message) {
60
+ var field_element = field.__elements[0];
61
+ var url = v2.Rails.remoteValidationUrlFor(name, field_element, value, []);
62
+
63
+ v2.Rails.initializeLastResult(name, field_element.id);
64
+
65
+ console.log(v2.Rails.lastRemoteValidationResult[name][field_element.id]);
66
+
67
+ var xmlHttpRequest = new XMLHttpRequest;
68
+ xmlHttpRequest.open('GET', url, true);
69
+ xmlHttpRequest.onreadystatechange = function() {
70
+ if (this.readyState == XMLHttpRequest.DONE) {
71
+ var validationResult = v2.bool(this.responseText);
72
+ v2.Rails.lastRemoteValidationResult[name][field_element.id] = validationResult;
73
+
74
+ /* Get all validators for this field, except the current validator. */
75
+ var fieldClasses = v2.trim(field_element.getAttribute('class').replace(new RegExp(name + '\w*'), ''));
76
+ var theOtherValidators = v2.html.validatorsFromString(fieldClasses);
77
+
78
+ /* Make remote-client validator trigger validation failure or not. */
79
+ var thisValidator = field_element.id.is('remote-client', validationResult).explain(message);
80
+ v2.html.applyValidators(theOtherValidators, thisValidator);
81
+
82
+ /* Trigger validation. */
83
+ thisValidator.item.validate();
84
+ };
85
+ };
86
+ xmlHttpRequest.send(null);
87
+ return v2.Rails.lastRemoteValidationResult[name][field_element.id];
88
+ };
79
89
 
80
90
  /**
81
91
  * Initialize data structure for holding info about last remote AJAX validation result.
82
92
  * We need this to make Validatious play well with remote validations.
83
93
  */
84
- v2.Rails.initializeLastResult = function initializeLastResult(validator_name, field_id) {
85
- if (typeof v2.Rails.lastRemoteValidationResult == 'undefined') {
86
- v2.Rails.lastRemoteValidationResult = new Array();
87
- }
88
- if (typeof v2.Rails.lastRemoteValidationResult[validator_name] == 'undefined') {
89
- v2.Rails.lastRemoteValidationResult[validator_name] = new Array();
90
- };
91
- if (typeof v2.Rails.lastRemoteValidationResult[validator_name][field_id] == 'undefined') {
92
- v2.Rails.lastRemoteValidationResult[validator_name][field_id] = false;
93
- };
94
- };
94
+ v2.Rails.initializeLastResult = function initializeLastResult(validator_name, field_id) {
95
+ if (!v2.present(v2.Rails.lastRemoteValidationResult)) {
96
+ v2.Rails.lastRemoteValidationResult = new Array();
97
+ };
98
+ if (!v2.present(v2.Rails.lastRemoteValidationResult[validator_name])) {
99
+ v2.Rails.lastRemoteValidationResult[validator_name] = new Array();
100
+ };
101
+ if (!v2.present(v2.Rails.lastRemoteValidationResult[validator_name][field_id])) {
102
+ v2.Rails.lastRemoteValidationResult[validator_name][field_id] = false;
103
+ };
104
+ };
95
105
 
96
106
  /**
97
107
  * Generate a remote validation poll URL the validatious-on-rails-way,
@@ -112,11 +122,11 @@ v2.Rails.remoteValidationUrlFor = function remoteValidationUrlFor(name, field, v
112
122
  [
113
123
  ['model', escape(modelName)].join('='),
114
124
  ['attribute', escape(attributeName)].join('='),
115
- ['id', recordId].join('='),
125
+ (v2.blank(recordId) ? null : ['id', recordId].join('=')),
116
126
  ['value', escape(value)].join('='),
117
127
  paramsString.join('&')
118
128
  ].join('&')
119
- ].join('').replace(/\&$/, '');
129
+ ].join('').replace(/\&\&/, '&').replace(/\&$/, '');
120
130
  return url;
121
131
  };
122
132
 
@@ -11,316 +11,314 @@ require File.join(File.dirname(__FILE__), *%w[validatious validators])
11
11
  # Validatious-Rails validation translator.
12
12
  #
13
13
  module ValidatiousOnRails
14
- class ModelValidations
15
-
16
- CORE_VALIDATIONS = [
17
- :acceptance_of,
18
- :associated,
19
- :confirmation_of,
20
- :exclusion_of,
21
- :format_of,
22
- :inclusion_of,
23
- :length_of,
24
- :numericality_of,
25
- :presence_of,
26
- :uniqueness_of
27
- ].freeze
28
- SUPPORTED_VALIDATIONS = CORE_VALIDATIONS
29
-
30
- class << self
31
-
32
- # References:
33
- # http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
34
- # http://github.com/rails/rails/blob/13fb26b714dec0874303f51cc125ff62f65a2729/activerecord/lib/active_record/validations.rb
35
-
36
- # Generates form field helper options for a specified object-attribute to
37
- # reflect on it's validations.
38
- #
39
- # Input may be an ActiveRecord class, a class name (string), or an object
40
- # name along with a method/field.
41
- #
42
- def options_for(object_name, attribute_method, options = {}, existing_validators = nil)
43
- # Handle Nested form.
44
- object_name = options[:object].present? ? options[:object].class.name : object_name
45
-
46
- validators = self.from_active_record(object_name, attribute_method)
47
- validator_classes, validator_js = [options[:class]], []
48
-
49
- # Only attach validators that are not already attached.
50
- validators.flatten.compact.uniq.each do |v|
51
- validator_js << v.to_js unless existing_validators.present? && /#{v.name}/ =~ existing_validators
52
- validator_classes << v.to_class
14
+ module ModelValidations
15
+
16
+ extend self
17
+
18
+ IGNORED_VALIDATIONS = [:each, :associated]
19
+
20
+ def validation_methods
21
+ ::ActiveRecord::Base.methods.sort.collect do |m|
22
+ $1.to_s.to_sym if (m.to_s =~ /^validates_(.*)/)
23
+ end.compact - IGNORED_VALIDATIONS
24
+ end
25
+
26
+ CORE_VALIDATIONS = self.validation_methods
27
+
28
+ # References:
29
+ # http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
30
+ # http://github.com/rails/rails/blob/13fb26b714dec0874303f51cc125ff62f65a2729/activerecord/lib/active_record/validations.rb
31
+
32
+ # Generates form field helper options for a specified object-attribute to
33
+ # reflect on it's validations.
34
+ #
35
+ # Input may be an ActiveRecord class, a class name (string), or an object
36
+ # name along with a method/field.
37
+ #
38
+ def options_for(object_name, attribute_method, options = {}, existing_validators = nil)
39
+ # Handle Nested form.
40
+ object_name = options[:object].present? ? options[:object].class.name : object_name
41
+
42
+ validators = self.from_active_record(object_name, attribute_method)
43
+ validator_classes, validator_js = [options[:class]], []
44
+
45
+ # Only attach validators that are not already attached.
46
+ validators.flatten.compact.uniq.each do |v|
47
+ validator_js << v.to_js unless existing_validators.present? && /#{v.name}/ =~ existing_validators
48
+ validator_classes << v.to_class
49
+ end
50
+ classes = validator_classes.compact.join(' ').strip
51
+ js = validator_js.compact.join("\n").strip
52
+ options.merge!(:class => (classes unless classes.blank?), :js => (js unless js.blank?))
53
+ end
54
+
55
+ # Groks Rails validations, and is able to convert a rails validation to
56
+ # a Validatious 2.0 compatible class string, and a Validatous validator
57
+ # for more complex validations. Even some of the Rails core validations
58
+ # with certain options requires this.
59
+ #
60
+ # Input may be an ActiveRecord class, a class name (string), or an object
61
+ # name along with a method/field.
62
+ #
63
+ # Returns a string that will be recognized by Validatious as a class name in
64
+ # form markup.
65
+ #
66
+ def from_active_record(object_or_class, attribute_method)
67
+ validators = []
68
+ begin
69
+ klass = if [::String, ::Symbol].any? { |c| object_or_class.is_a?(c) }
70
+ object_or_class.to_s.classify.constantize
71
+ elsif object_or_class.is_a?(::Object)
72
+ object_or_class.class
73
+ else
74
+ object_or_class
53
75
  end
54
- classes = validator_classes.compact.join(' ').strip
55
- js = validator_js.compact.join("\n").strip
56
- options.merge!(:class => (classes unless classes.blank?), :js => (js unless js.blank?))
76
+ return validators unless klass.respond_to?(:reflect_on_validations_for)
77
+ rescue
78
+ ::ValidatiousOnRails.log "Missing constant: #{object_or_class}", :debug
79
+ return validators
57
80
  end
58
81
 
59
- # Groks Rails validations, and is able to convert a rails validation to
60
- # a Validatious 2.0 compatible class string, and a Validatous validator
61
- # for more complex validations. Even some of the Rails core validations
62
- # with certain options requires this.
63
- #
64
- # Input may be an ActiveRecord class, a class name (string), or an object
65
- # name along with a method/field.
66
- #
67
- # Returns a string that will be recognized by Validatious as a class name in
68
- # form markup.
69
- #
70
- def from_active_record(object_or_class, attribute_method)
71
- validators = []
72
- begin
73
- klass = if [::String, ::Symbol].any? { |c| object_or_class.is_a?(c) }
74
- object_or_class.to_s.classify.constantize
75
- elsif object_or_class.is_a?(::Object)
76
- object_or_class.class
77
- else
78
- object_or_class
79
- end
80
- return validators unless klass.respond_to?(:reflect_on_validations_for)
81
- rescue
82
- ::ValidatiousOnRails.log "Missing constant: #{object_or_class}", :debug
83
- return validators
82
+ # Iterate thorugh the validations for the current class,
83
+ # and collect validation options.
84
+ klass.reflect_on_validations_for(attribute_method.to_sym).each do |validation|
85
+ validates_type = validation.macro.to_s.sub(/^validates?_/, '')
86
+ if validation.options[:client_side].nil?
87
+ validation.options[:client_side] = ::ValidatiousOnRails.client_side_validations_by_default
84
88
  end
85
89
 
86
- # Iterate thorugh the validations for the current class,
87
- # and collect validation options.
88
- klass.reflect_on_validations_for(attribute_method.to_sym).each do |validation|
89
- validates_type = validation.macro.to_s.sub(/^validates?_/, '')
90
+ # Skip "confirmation_of"-validation info for the attribute that
91
+ # needs to be confirmed. Validatious expects this validation rule
92
+ # on the confirmation field. *
93
+ unless validates_type =~ /^confirmation_of$/
94
+ validators << self.send(validates_type.to_sym, validation) if validation.options[:client_side]
95
+ end
96
+ end
97
+
98
+ # Special case for "confirmation_of"-validation (see * above).
99
+ if attribute_method.to_s =~ /(.+)_confirmation$/
100
+ confirm_attribute_method = $1
101
+ # Check if validates_confirmation_of(:hello) actually exists,
102
+ # if :hello_confirmation field exists - just to be safe.
103
+ klass.reflect_on_validations_for(confirm_attribute_method.to_sym).each do |validation|
90
104
  if validation.options[:client_side].nil?
91
105
  validation.options[:client_side] = ::ValidatiousOnRails.client_side_validations_by_default
92
106
  end
93
107
 
94
- # Skip "confirmation_of"-validation info for the attribute that
95
- # needs to be confirmed. Validatious expects this validation rule
96
- # on the confirmation field. *
97
- unless validates_type =~ /^confirmation_of$/
98
- validators << self.send(validates_type.to_sym, validation) if validation.options[:client_side]
99
- end
100
- end
101
-
102
- # Special case for "confirmation_of"-validation (see * above).
103
- if attribute_method.to_s =~ /(.+)_confirmation$/
104
- confirm_attribute_method = $1
105
- # Check if validates_confirmation_of(:hello) actually exists,
106
- # if :hello_confirmation field exists - just to be safe.
107
- klass.reflect_on_validations_for(confirm_attribute_method.to_sym).each do |validation|
108
- if validation.options[:client_side].nil?
109
- validation.options[:client_side] = ::ValidatiousOnRails.client_side_validations_by_default
110
- end
111
-
112
- if validation.macro.to_s =~ /^validates_confirmation_of$/
113
- validators << self.confirmation_of(validation) if validation.options[:client_side]
114
- break
115
- end
108
+ if validation.macro.to_s =~ /^validates_confirmation_of$/
109
+ validators << self.confirmation_of(validation) if validation.options[:client_side]
110
+ break
116
111
  end
117
112
  end
118
- validators.flatten.compact
119
113
  end
114
+ validators.flatten.compact
115
+ end
120
116
 
121
- # Resolve validation from validates_acceptance_of.
122
- #
123
- # Alias, but might change: acceptance_of <=> presence_of
124
- #
125
- # NOTE: Not supported:
126
- # * :on - TODO.
127
- # * :if/:unless - hard to port all to client-side JavaScript
128
- # (impossible: procs, unaccessible valiables, etc.).
129
- #
130
- def acceptance_of(validation)
131
- validators = []
132
- validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
133
- validation.options[:accept] ||= '1' # Rails default.
134
- validators << Validatious::AcceptanceAcceptValidator.new(validation.options[:accept],
135
- validation.options[:allow_nil])
136
- end
117
+ # Resolve validation from validates_acceptance_of.
118
+ #
119
+ # Alias, but might change: acceptance_of <=> presence_of
120
+ #
121
+ # NOTE: Not supported:
122
+ # * :on - TODO.
123
+ # * :if/:unless - hard to port all to client-side JavaScript
124
+ # (impossible: procs, unaccessible valiables, etc.).
125
+ #
126
+ def acceptance_of(validation)
127
+ validators = []
128
+ validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
129
+ validation.options[:accept] ||= '1' # Rails default.
130
+ validators << Validatious::AcceptanceAcceptValidator.new(validation.options[:accept],
131
+ validation.options[:allow_nil])
132
+ end
137
133
 
138
- # Resolve validation from validates_associated.
139
- #
140
- # NOTE: Not supported - low prio.
141
- #
142
- def associated(validation)
143
- nil
144
- end
134
+ # Resolve validation from validates_associated.
135
+ #
136
+ # NOTE: Not supported - low prio.
137
+ #
138
+ def associated(validation)
139
+ nil
140
+ end
145
141
 
146
- # Resolve validation from validates_confirmation_of.
147
- # This validation is treated a bit differently in compare
148
- # to the other validations. See "from_active_record".
149
- #
150
- # NOTE: Not supported:
151
- # * :on - TODO.
152
- # * :if/:unless - hard to port all to client-side JavaScript
153
- # (impossible: procs, unaccessible valiables, etc.).
154
- #
155
- def confirmation_of(validation)
156
- validators = []
157
- field_id = unless validation.active_record.present?
158
- "#{validation.active_record.name.tableize.singularize.gsub('/', '_')}_#{validation.name}"
159
- else
160
- "#{validation.name}"
161
- end
162
- validators << Validatious::ConfirmationOfValidator.new(field_id)
142
+ # Resolve validation from validates_confirmation_of.
143
+ # This validation is treated a bit differently in compare
144
+ # to the other validations. See "from_active_record".
145
+ #
146
+ # NOTE: Not supported:
147
+ # * :on - TODO.
148
+ # * :if/:unless - hard to port all to client-side JavaScript
149
+ # (impossible: procs, unaccessible valiables, etc.).
150
+ #
151
+ def confirmation_of(validation)
152
+ validators = []
153
+ field_id = unless validation.active_record.present?
154
+ "#{validation.active_record.name.tableize.singularize.gsub('/', '_')}_#{validation.name}"
155
+ else
156
+ "#{validation.name}"
163
157
  end
158
+ validators << Validatious::ConfirmationOfValidator.new(field_id)
159
+ end
164
160
 
165
- # Resolve validation from validates_exclusion_of.
166
- #
167
- # Attaching custom validator - with a unique name based on the exclusion values.
168
- #
169
- # NOTE: Not supported:
170
- # * :on - TODO.
171
- # * :if/:unless - hard to port all to client-side JavaScript
172
- # (impossible: procs, unaccessible valiables, etc.).
173
- #
174
- def exclusion_of(validation)
175
- validators = []
176
- validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
177
- validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
178
- validators << Validatious::ExclusionInValidator.new(validation.options[:in],
179
- validation.options[:allow_nil], validation.options[:allow_blank])
180
- end
161
+ # Resolve validation from validates_exclusion_of.
162
+ #
163
+ # Attaching custom validator - with a unique name based on the exclusion values.
164
+ #
165
+ # NOTE: Not supported:
166
+ # * :on - TODO.
167
+ # * :if/:unless - hard to port all to client-side JavaScript
168
+ # (impossible: procs, unaccessible valiables, etc.).
169
+ #
170
+ def exclusion_of(validation)
171
+ validators = []
172
+ validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
173
+ validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
174
+ validators << Validatious::ExclusionInValidator.new(validation.options[:in],
175
+ validation.options[:allow_nil], validation.options[:allow_blank])
176
+ end
181
177
 
182
- # Resolve validation from validates_format_of.
183
- #
184
- # Attaching custom validator, with a unique name based on the regular expression.
185
- # Needs regexp.inspect to get it right.
186
- #
187
- # NOTE: Not supported:
188
- # * :on - TODO.
189
- # * :if/:unless - hard to port all to client-side JavaScript
190
- # (impossible: procs, unaccessible valiables, etc.).
191
- #
192
- def format_of(validation)
193
- validators = []
194
- validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
195
- validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
196
- validators << Validatious::FormatWithValidator.new(validation.options[:with],
197
- validation.options[:allow_nil], validation.options[:allow_blank])
198
- end
178
+ # Resolve validation from validates_format_of.
179
+ #
180
+ # Attaching custom validator, with a unique name based on the regular expression.
181
+ # Needs regexp.inspect to get it right.
182
+ #
183
+ # NOTE: Not supported:
184
+ # * :on - TODO.
185
+ # * :if/:unless - hard to port all to client-side JavaScript
186
+ # (impossible: procs, unaccessible valiables, etc.).
187
+ #
188
+ def format_of(validation)
189
+ validators = []
190
+ validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
191
+ validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
192
+ validators << Validatious::FormatWithValidator.new(validation.options[:with],
193
+ validation.options[:allow_nil], validation.options[:allow_blank])
194
+ end
199
195
 
200
- # Resolve validation from validates_inclusion_of.
201
- #
202
- # Attaching custom validator - with a unique name based on the inclusion values.
203
- #
204
- # NOTE: Not supported:
205
- # * :on - TODO.
206
- # * :if/:unless - hard to port all to client-side JavaScript
207
- # (impossible: procs, unaccessible valiables, etc.).
208
- #
209
- def inclusion_of(validation)
210
- validators = []
211
- validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
212
- validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
213
- validators << Validatious::InclusionInValidator.new(validation.options[:in],
214
- validation.options[:allow_nil], validation.options[:allow_blank])
215
- end
196
+ # Resolve validation from validates_inclusion_of.
197
+ #
198
+ # Attaching custom validator - with a unique name based on the inclusion values.
199
+ #
200
+ # NOTE: Not supported:
201
+ # * :on - TODO.
202
+ # * :if/:unless - hard to port all to client-side JavaScript
203
+ # (impossible: procs, unaccessible valiables, etc.).
204
+ #
205
+ def inclusion_of(validation)
206
+ validators = []
207
+ validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
208
+ validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
209
+ validators << Validatious::InclusionInValidator.new(validation.options[:in],
210
+ validation.options[:allow_nil], validation.options[:allow_blank])
211
+ end
216
212
 
217
- # Resolve validation from validates_length_of.
218
- #
219
- # Example (of generated field classes):
220
- # length-is_5, length-maximum_2, length-minimum_2, etc.
221
- #
222
- # NOTE: Not supported:
223
- # * :tokenizer - see: :if/:unless
224
- # * :on - TODO.
225
- # * :if/:unless - hard to port all to client-side JavaScript
226
- # (impossible: procs, unaccessible valiables, etc.).
227
- #
228
- def length_of(validation)
229
- validators = []
230
- validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
231
- validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
232
-
233
- if validation.options[:is].present?
234
- validators << Validatious::Length::IsValidator.new(validation.options[:is],
235
- (validation.options[:allow_nil] || false),
236
- (validation.options[:allow_blank] || false))
237
- elsif [:in, :within, :minimum, :maximum].any? { |k| validation.options[k].present? }
238
- validation.options[:within] ||= validation.options[:in]
239
- validation.options[:minimum] ||= validation.options[:within].min rescue nil
240
- validation.options[:maximum] ||= validation.options[:within].max rescue nil
241
-
242
- if validation.options[:minimum].present?
243
- validators << Validatious::Length::MinimumValidator.new(validation.options[:minimum],
244
- (validation.options[:allow_nil] || false),
245
- (validation.options[:allow_blank] || false))
246
- end
213
+ # Resolve validation from validates_length_of.
214
+ #
215
+ # Example (of generated field classes):
216
+ # length-is_5, length-maximum_2, length-minimum_2, etc.
217
+ #
218
+ # NOTE: Not supported:
219
+ # * :tokenizer - see: :if/:unless
220
+ # * :on - TODO.
221
+ # * :if/:unless - hard to port all to client-side JavaScript
222
+ # (impossible: procs, unaccessible valiables, etc.).
223
+ #
224
+ def length_of(validation)
225
+ validators = []
226
+ validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
227
+ validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
247
228
 
248
- if validation.options[:maximum].present?
249
- validators << Validatious::Length::MaximumValidator.new(validation.options[:maximum],
250
- (validation.options[:allow_nil] || false),
251
- (validation.options[:allow_blank] || false))
252
- end
253
- end
254
- validators
255
- end
256
- alias :size_of :length_of
257
-
258
- # Resolve validation from validates_numericality_of.
259
- #
260
- # Example (of generated field classes):
261
- # numericality-odd, numericality-only-integer, numericality-equal-to_5, etc.
262
- #
263
- # NOTE: Not supported:
264
- # * :on - TODO.en
265
- # * :if/:unless - hard to port all to client-side JavaScript
266
- # (impossible: procs, unaccessible valiables, etc.).
267
- #
268
- def numericality_of(validation)
269
- validators = []
270
- validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
271
-
272
- if validation.options[:odd] && !validation.options[:even]
273
- validators << Validatious::Numericality::OddValidator.new(validation.options[:allow_nil])
274
- end
229
+ if validation.options[:is].present?
230
+ validators << Validatious::Length::IsValidator.new(validation.options[:is],
231
+ (validation.options[:allow_nil] || false),
232
+ (validation.options[:allow_blank] || false))
233
+ elsif [:in, :within, :minimum, :maximum].any? { |k| validation.options[k].present? }
234
+ validation.options[:within] ||= validation.options[:in]
235
+ validation.options[:minimum] ||= validation.options[:within].min rescue nil
236
+ validation.options[:maximum] ||= validation.options[:within].max rescue nil
275
237
 
276
- if validation.options[:even] && !validation.options[:odd]
277
- validators << Validatious::Numericality::EvenValidator.new(validation.options[:allow_nil])
238
+ if validation.options[:minimum].present?
239
+ validators << Validatious::Length::MinimumValidator.new(validation.options[:minimum],
240
+ (validation.options[:allow_nil] || false),
241
+ (validation.options[:allow_blank] || false))
278
242
  end
279
243
 
280
- if validation.options[:only_integer]
281
- validators << Validatious::Numericality::OnlyIntegerValidator.new(validation.options[:allow_nil])
244
+ if validation.options[:maximum].present?
245
+ validators << Validatious::Length::MaximumValidator.new(validation.options[:maximum],
246
+ (validation.options[:allow_nil] || false),
247
+ (validation.options[:allow_blank] || false))
282
248
  end
283
-
284
- (validation.options.keys & [:equal_to, :less_than, :less_than_or_equal_to,
285
- :greater_than, :greater_than_or_equal_to]).each { |name|
286
- validator_klass = "::ValidatiousOnRails::Validatious::Numericality::#{name.to_s.classify}Validator".constantize
287
- value = validation.options[name]
288
- if value.is_a?(::Numeric)
289
- validators << validator_klass.new(validation.options[name], validation.options[:allow_nil])
290
- end
291
- }
292
- validators
293
249
  end
250
+ validators
251
+ end
252
+ alias :size_of :length_of
294
253
 
295
- # Resolve validation from validates_presence_of.
296
- #
297
- # Alias, but might change: acceptance_of <=> presence_of
298
- #
299
- # NOTE: Not supported:
300
- # * :on - TODO.
301
- # * :if/:unless - hard to port all to client-side JavaScript
302
- # (impossible: procs, unaccessible valiables, etc.).
303
- #
304
- def presence_of(validation)
305
- validators = []
306
- validators << Validatious::PresenceValidator.new
254
+ # Resolve validation from validates_numericality_of.
255
+ #
256
+ # Example (of generated field classes):
257
+ # numericality-odd, numericality-only-integer, numericality-equal-to_5, etc.
258
+ #
259
+ # NOTE: Not supported:
260
+ # * :on - TODO.en
261
+ # * :if/:unless - hard to port all to client-side JavaScript
262
+ # (impossible: procs, unaccessible valiables, etc.).
263
+ #
264
+ def numericality_of(validation)
265
+ validators = []
266
+ validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
267
+
268
+ if validation.options[:odd] && !validation.options[:even]
269
+ validators << Validatious::Numericality::OddValidator.new(validation.options[:allow_nil])
307
270
  end
308
271
 
309
- # Resolve validation from validates_uniqueness_of.
310
- #
311
- def uniqueness_of(validation)
312
- validators = []
313
- validators << Validatious::UniquenessValidator.new
272
+ if validation.options[:even] && !validation.options[:odd]
273
+ validators << Validatious::Numericality::EvenValidator.new(validation.options[:allow_nil])
314
274
  end
315
275
 
316
- # Unknown validations - if no matching custom validator is found/registered.
317
- #
318
- def method_missing(sym, *args, &block)
319
- ::ValidatiousOnRails.log "Unknown validation: #{sym}." <<
320
- " No custom Validatious validator found for this validation makro. ", :warn
321
- nil
276
+ if validation.options[:only_integer]
277
+ validators << Validatious::Numericality::OnlyIntegerValidator.new(validation.options[:allow_nil])
322
278
  end
323
279
 
280
+ (validation.options.keys & [:equal_to, :less_than, :less_than_or_equal_to,
281
+ :greater_than, :greater_than_or_equal_to]).each { |name|
282
+ validator_klass = "::ValidatiousOnRails::Validatious::Numericality::#{name.to_s.classify}Validator".constantize
283
+ value = validation.options[name]
284
+ if value.is_a?(::Numeric)
285
+ validators << validator_klass.new(validation.options[name], validation.options[:allow_nil])
286
+ end
287
+ }
288
+ validators
289
+ end
290
+
291
+ # Resolve validation from validates_presence_of.
292
+ #
293
+ # Alias, but might change: acceptance_of <=> presence_of
294
+ #
295
+ # NOTE: Not supported:
296
+ # * :on - TODO.
297
+ # * :if/:unless - hard to port all to client-side JavaScript
298
+ # (impossible: procs, unaccessible valiables, etc.).
299
+ #
300
+ def presence_of(validation)
301
+ validators = []
302
+ validators << Validatious::PresenceValidator.new
303
+ end
304
+
305
+ # Resolve validation from validates_uniqueness_of.
306
+ #
307
+ def uniqueness_of(validation)
308
+ validators = []
309
+ validation.options[:allow_nil] = false if validation.options[:allow_nil].nil?
310
+ validation.options[:allow_blank] = false if validation.options[:allow_blank].nil?
311
+ validators << Validatious::UniquenessValidator.new(validation.options[:allow_nil], validation.options[:allow_blank])
324
312
  end
313
+
314
+ # Unknown validations - if no matching custom validator is found/registered.
315
+ #
316
+ def method_missing(sym, *args, &block)
317
+ ::ValidatiousOnRails.log "Unknown validation: #{sym}." <<
318
+ " No custom Validatious validator found for this validation makro. ", :warn
319
+ nil
320
+ end
321
+
322
+ #end
325
323
  end
326
324
  end
@@ -17,7 +17,10 @@ module ValidatiousOnRails
17
17
  def fn
18
18
  self.class.truncate_whitespace(@fn ||= %{
19
19
  function(field, value, params) {
20
- return !!v2.Rails.performRemoteValidation('#{self.name}', field, value, params, '#{self.message}');
20
+ value += '';
21
+ #{self.class.handle_nil(0)}
22
+ #{self.class.handle_blank(1)}
23
+ return v2.Rails.performRemoteValidation(#{self.name.to_json}, field, value, params, #{self.message.to_json});
21
24
  }
22
25
  })
23
26
  end
@@ -168,7 +168,7 @@ module ValidatiousOnRails
168
168
 
169
169
  def handle_nil(index = 1)
170
170
  %{
171
- if (v2.bool(params[#{index}]) && v2.empty(value)) {
171
+ if (v2.present(params[#{index}]) && v2.bool(params[#{index}]) && v2.empty(value)) {
172
172
  return true;
173
173
  };
174
174
  }
@@ -176,10 +176,10 @@ module ValidatiousOnRails
176
176
 
177
177
  def handle_blank(index = 2)
178
178
  %{
179
- if (v2.bool(params[#{index}]) && v2.blank(value)) {
179
+ if (v2.present(params[#{index}]) && v2.bool(params[#{index}]) && v2.blank(value)) {
180
180
  return true;
181
181
  };
182
- if (!v2.bool(params[#{index}])) {
182
+ if (v2.present(params[#{index}]) && !v2.bool(params[#{index}])) {
183
183
  v2.trimField(field);
184
184
  value = v2.trim(value);
185
185
  };
@@ -7,8 +7,7 @@ module ValidatiousOnRails
7
7
 
8
8
  def initialize(*args)
9
9
  super
10
- self.params = %w[]
11
- self.message = self.class.generate_message(:blank)
10
+ self.message = self.class.generate_message(:taken)
12
11
  end
13
12
 
14
13
  end
@@ -64,23 +64,22 @@ class ControllerTest < ::ActionController::TestCase
64
64
  # assert_response 405
65
65
  # assert_equal 'false', @response.body
66
66
  # end
67
-
68
- # test ":value is allowed to be blank - should succeed" do
69
- # get :uniqueness_of, :model => 'bogus_item', :attribute => 'name'
70
- # assert_response 200
71
- # assert_equal 'true', @response.body
72
- # end
67
+ #
68
+ # test ":value is allowed to be blank - should succeed" do
69
+ # get :uniqueness_of, :model => 'bogus_item', :attribute => 'name'
70
+ # assert_response 200
71
+ # assert_equal 'true', @response.body
72
+ # end
73
73
  end
74
74
 
75
75
  context "with :value" do
76
- # FIXME: Fails, but why? Works "in practice".
77
76
  test "invalid value - should fail" do
78
77
  @existing_bogus_item = ::BogusItem.new(:name => 'carrot')
79
78
  @existing_bogus_item.save(false)
80
79
 
81
80
  get :uniqueness_of, :model => 'bogus_item', :attribute => 'name', :value => 'carrot'
82
81
  assert_response 200
83
- assert_equal 'true', @response.body
82
+ assert_equal 'false', @response.body
84
83
  end
85
84
 
86
85
  test "valid :value - should succeed" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validatious-on-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Grimfelt
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-10-29 00:00:00 +01:00
13
+ date: 2009-10-31 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies: []
16
16