realtime-validations 0.0.8 → 0.0.9

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.
@@ -5,25 +5,51 @@ module RealtimeValidations
5
5
  include Controller
6
6
 
7
7
  def validate
8
- model_name = params[:model]
9
- request.path =~ /^\/validations(.+)$/
10
- request_path = $1
11
- args = remove_unused_args Rails.application.routes.recognize_path(request_path)
12
- field = params[:field]
13
- if not field =~ /^[^\[]+\[(\w+)\]$/
8
+ args = identify_args
9
+ begin
10
+ field = identify_field
11
+ rescue Exceptions::InvalidData
14
12
  render :json => { :field => params[:field],
15
13
  :errors => [] }
16
14
  return
17
15
  end
18
- field = $1
19
- value = params[:value]
20
- validates = params[:validates]
16
+ model = retrieve_or_create_model args, params[:model]
17
+ send_messages_to_model args, model, field
18
+ model_valid? model
19
+ respond_to_validation retrieve_model_errors(model, field)
20
+ end
21
+
22
+ private
23
+
24
+ def identify_args
25
+ request.path =~ /^\/validations(.+)$/
26
+ request_path = $1
27
+ remove_unused_args Rails.application.routes.recognize_path(request_path)
28
+ end
29
+
30
+ def remove_unused_args(args)
31
+ [:action, :controller].each { |key| args.delete key }
32
+ args
33
+ end
34
+
35
+ def identify_field
36
+ raise Exceptions::InvalidData unless params[:field] =~ /^[^\[]+\[(\w+)\]$/
37
+ $1
38
+ end
39
+
40
+ def retrieve_or_create_model(args, model_name)
21
41
  if args.has_key? :id
22
42
  model = Object.const_get("#{model_name}".camelize.to_sym).find args[:id]
23
43
  args.delete :id
24
44
  else
25
45
  model = Object.const_get("#{model_name}".camelize.to_sym).new
26
46
  end
47
+ model
48
+ end
49
+
50
+ def send_messages_to_model(args, model, field)
51
+ value = params[:value]
52
+ validates = params[:validates]
27
53
  args.each do |key, value|
28
54
  full_key = key.to_s.singularize
29
55
  model.send "#{full_key}=", value if model.respond_to? full_key.to_sym
@@ -31,24 +57,26 @@ module RealtimeValidations
31
57
  model.send "#{field}=", value
32
58
  model.send "#{field}_confirmation=", validates if validates
33
59
  before_model_validation model if respond_to? :before_model_validation
60
+ end
61
+
62
+ def model_valid?(model)
34
63
  begin
35
64
  model.valid?
36
65
  rescue
37
66
  end
38
- errors = model.errors[field.to_sym].uniq
67
+ end
68
+
69
+ def retrieve_model_errors(model, field)
70
+ model.errors[field.to_sym].uniq
71
+ end
72
+
73
+ def respond_to_validation(errors)
39
74
  respond_to do |format|
40
75
  format.json { render :json => { :field => params[:field],
41
76
  :errors => errors } }
42
77
  end
43
78
  end
44
79
 
45
- private
46
-
47
- def remove_unused_args(args)
48
- [:action, :controller].each { |key| args.delete key }
49
- args
50
- end
51
-
52
80
  end
53
81
 
54
82
  end
@@ -10,7 +10,7 @@ module RealtimeValidations
10
10
 
11
11
  def copy_initializer_file
12
12
  copy_file 'initializer.rb', 'config/initializers/realtime_validations_initializer.rb'
13
- copy_file 'realtime_validations.js', 'app/assets/javascripts/realtime_validations.js'
13
+ copy_file 'realtime_validations.custom.js', 'app/assets/javascripts/realtime_validations.custom.js'
14
14
  end
15
15
 
16
16
  end
@@ -0,0 +1,3 @@
1
+ RealTimeValidations.customFields = function() {
2
+ return { };
3
+ }
@@ -1,3 +1,3 @@
1
1
  module RealtimeValidations
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
3
3
  end
@@ -0,0 +1,97 @@
1
+ var RealTimeValidations = {
2
+
3
+ bind_fields : function() {
4
+ $('form[validation="true"] :input').each(function(i, field) {
5
+ RealTimeValidations.bind_field(field);
6
+ });
7
+ },
8
+
9
+ bind_field : function(field) {
10
+ var field_to_validate = $('#' + field.id);
11
+ if (RealTimeValidations.should_bind_field(field_to_validate)) {
12
+ field_to_validate.blur(RealTimeValidations.bind_field_on_blur);
13
+ }
14
+ },
15
+
16
+ should_bind_field : function(field) {
17
+ var validate = field.attr('validate');
18
+ if ($.isEmptyObject(validate)) {
19
+ return true;
20
+ }
21
+ return validate == 'true';
22
+ },
23
+
24
+ bind_field_on_blur : function() {
25
+ var field = $(this);
26
+ var form_to_validate = $('form[validation="true"]');
27
+ var validation_path = RealTimeValidations.path(form_to_validate);
28
+ var model = form_to_validate.attr('model');
29
+ var field_name = field.attr('name');
30
+ var matched = field_name.match(/(\w+)\[(\w+)_confirmation\]/);
31
+ var data_to_send = null;
32
+ var current_value = field.val();
33
+
34
+ if (matched) {
35
+ var field_canonical_namespace = matched[1];
36
+ var field_canonical_name = matched[2];
37
+ var validation_value = $('#' + field_canonical_namespace + '_' + field_canonical_name).val();
38
+ data_to_send = { field: field_name.replace("_confirmation", ""), value: current_value,
39
+ validates: validation_value, model: model };
40
+ } else {
41
+ data_to_send = { field: field_name, value: current_value, model: model };
42
+ }
43
+
44
+ var custom_data_to_send = RealTimeValidations.customFields();
45
+ $.extend(data_to_send, custom_data_to_send);
46
+
47
+ $.post(validation_path, data_to_send, function(data) {
48
+ if ($.isEmptyObject(data.errors)) {
49
+ RealTimeValidations.hide_warning_message(field);
50
+ } else {
51
+ RealTimeValidations.show_warning_message(field, data.errors);
52
+ }
53
+ });
54
+ },
55
+
56
+ path : function(form) {
57
+ return '/validations' + form.attr('action');
58
+ },
59
+
60
+ show_warning_message : function(field, errors) {
61
+ var validation_errors = field.attr('validation-errors');
62
+ if (!$.isEmptyObject(validation_errors) && (validation_errors.toString() == errors.toString())) {
63
+ return;
64
+ }
65
+ field.attr('valid', false);
66
+ field.attr('validation-errors', errors);
67
+ if ($('#' + field.attr('id') + '_error').length) {
68
+ $('#' + field.attr('id') + '_error').remove();
69
+ }
70
+ field.parent().append('<div style="display: none;" id="' + field.attr('id') + '_error" class="field-error">'
71
+ + errors.join(', ') +
72
+ '<div class="field-error-arrow-border"></div> \
73
+ <div class="field-error-arrow"></div> \
74
+ </div>');
75
+ $('#' + field.attr('id') + '_error').fadeIn('slow');
76
+ },
77
+
78
+ hide_warning_message : function(field) {
79
+ field.attr('valid', true);
80
+ field.attr('validation-errors', null);
81
+ $('#' + field.attr('id') + '_error').fadeOut('slow', function() {
82
+ $(this).remove();
83
+ });
84
+ },
85
+
86
+ customFields : function() {
87
+ return { };
88
+ }
89
+
90
+ };
91
+
92
+ $(document).ready(RealTimeValidations.bind_fields);
93
+
94
+ $(document).ajaxSend(function(e, xhr, options) {
95
+ var token = $("meta[name='csrf-token']").attr("content");
96
+ xhr.setRequestHeader("X-CSRF-Token", token);
97
+ });
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: realtime-validations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-01-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &21386300 !ruby/object:Gem::Requirement
16
+ requirement: &13842960 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.1.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *21386300
24
+ version_requirements: *13842960
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sqlite3
27
- requirement: &21385880 !ruby/object:Gem::Requirement
27
+ requirement: &13841700 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *21385880
35
+ version_requirements: *13841700
36
36
  description: Form real time validations for free on Rails applications
37
37
  email:
38
38
  - ereslibre@gmail.com
@@ -40,50 +40,50 @@ executables: []
40
40
  extensions: []
41
41
  extra_rdoc_files: []
42
42
  files:
43
- - app/assets/stylesheets/realtime_validations/core.css
44
- - app/assets/javascripts/realtime_validations/core.js
45
43
  - app/controllers/realtime_validations/validations_controller.rb
46
- - config/routes.rb
47
44
  - config/initializers/form_validated_for.rb
48
- - lib/realtime-validations.rb
49
- - lib/realtime-validations/version.rb
50
- - lib/generators/realtime_validations/install_generator.rb
45
+ - config/routes.rb
51
46
  - lib/generators/realtime_validations/templates/initializer.rb
52
- - lib/generators/realtime_validations/templates/realtime_validations.js
47
+ - lib/generators/realtime_validations/templates/realtime_validations.custom.js
48
+ - lib/generators/realtime_validations/install_generator.rb
49
+ - lib/realtime-validations/version.rb
53
50
  - lib/tasks/realtime-validations_tasks.rake
51
+ - lib/realtime-validations.rb
52
+ - vendor/assets/javascripts/realtime_validations.js
53
+ - vendor/assets/stylesheets/realtime_validations.css
54
54
  - MIT-LICENSE
55
55
  - Rakefile
56
56
  - README.rdoc
57
- - test/test_helper.rb
58
- - test/dummy/public/404.html
59
- - test/dummy/public/favicon.ico
60
57
  - test/dummy/public/422.html
58
+ - test/dummy/public/404.html
61
59
  - test/dummy/public/500.html
62
- - test/dummy/config/application.rb
63
- - test/dummy/config/database.yml
64
- - test/dummy/config/environment.rb
65
- - test/dummy/config/routes.rb
66
- - test/dummy/config/environments/production.rb
67
- - test/dummy/config/environments/development.rb
60
+ - test/dummy/public/favicon.ico
61
+ - test/dummy/config.ru
62
+ - test/dummy/script/rails
68
63
  - test/dummy/config/environments/test.rb
64
+ - test/dummy/config/environments/development.rb
65
+ - test/dummy/config/environments/production.rb
69
66
  - test/dummy/config/locales/en.yml
70
- - test/dummy/config/boot.rb
71
- - test/dummy/config/initializers/mime_types.rb
72
- - test/dummy/config/initializers/wrap_parameters.rb
67
+ - test/dummy/config/environment.rb
73
68
  - test/dummy/config/initializers/session_store.rb
74
69
  - test/dummy/config/initializers/inflections.rb
75
- - test/dummy/config/initializers/secret_token.rb
70
+ - test/dummy/config/initializers/mime_types.rb
76
71
  - test/dummy/config/initializers/backtrace_silencers.rb
77
- - test/dummy/script/rails
78
- - test/dummy/config.ru
79
- - test/dummy/README.rdoc
80
- - test/dummy/app/assets/stylesheets/application.css
81
- - test/dummy/app/assets/javascripts/application.js
72
+ - test/dummy/config/initializers/wrap_parameters.rb
73
+ - test/dummy/config/initializers/secret_token.rb
74
+ - test/dummy/config/database.yml
75
+ - test/dummy/config/routes.rb
76
+ - test/dummy/config/boot.rb
77
+ - test/dummy/config/application.rb
78
+ - test/dummy/Rakefile
82
79
  - test/dummy/app/controllers/application_controller.rb
83
80
  - test/dummy/app/views/layouts/application.html.erb
84
81
  - test/dummy/app/helpers/application_helper.rb
85
- - test/dummy/Rakefile
82
+ - test/dummy/app/assets/javascripts/application.js
83
+ - test/dummy/app/assets/stylesheets/application.css
84
+ - test/dummy/README.rdoc
86
85
  - test/realtime-validations_test.rb
86
+ - test/test_helper.rb
87
87
  homepage: http://www.ereslibre.es/
88
88
  licenses: []
89
89
  post_install_message:
@@ -104,38 +104,38 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
104
  version: '0'
105
105
  requirements: []
106
106
  rubyforge_project:
107
- rubygems_version: 1.8.11
107
+ rubygems_version: 1.8.12
108
108
  signing_key:
109
109
  specification_version: 3
110
110
  summary: Provides real time validations for free
111
111
  test_files:
112
- - test/test_helper.rb
113
- - test/dummy/public/404.html
114
- - test/dummy/public/favicon.ico
115
112
  - test/dummy/public/422.html
113
+ - test/dummy/public/404.html
116
114
  - test/dummy/public/500.html
117
- - test/dummy/config/application.rb
118
- - test/dummy/config/database.yml
119
- - test/dummy/config/environment.rb
120
- - test/dummy/config/routes.rb
121
- - test/dummy/config/environments/production.rb
122
- - test/dummy/config/environments/development.rb
115
+ - test/dummy/public/favicon.ico
116
+ - test/dummy/config.ru
117
+ - test/dummy/script/rails
123
118
  - test/dummy/config/environments/test.rb
119
+ - test/dummy/config/environments/development.rb
120
+ - test/dummy/config/environments/production.rb
124
121
  - test/dummy/config/locales/en.yml
125
- - test/dummy/config/boot.rb
126
- - test/dummy/config/initializers/mime_types.rb
127
- - test/dummy/config/initializers/wrap_parameters.rb
122
+ - test/dummy/config/environment.rb
128
123
  - test/dummy/config/initializers/session_store.rb
129
124
  - test/dummy/config/initializers/inflections.rb
130
- - test/dummy/config/initializers/secret_token.rb
125
+ - test/dummy/config/initializers/mime_types.rb
131
126
  - test/dummy/config/initializers/backtrace_silencers.rb
132
- - test/dummy/script/rails
133
- - test/dummy/config.ru
134
- - test/dummy/README.rdoc
135
- - test/dummy/app/assets/stylesheets/application.css
136
- - test/dummy/app/assets/javascripts/application.js
127
+ - test/dummy/config/initializers/wrap_parameters.rb
128
+ - test/dummy/config/initializers/secret_token.rb
129
+ - test/dummy/config/database.yml
130
+ - test/dummy/config/routes.rb
131
+ - test/dummy/config/boot.rb
132
+ - test/dummy/config/application.rb
133
+ - test/dummy/Rakefile
137
134
  - test/dummy/app/controllers/application_controller.rb
138
135
  - test/dummy/app/views/layouts/application.html.erb
139
136
  - test/dummy/app/helpers/application_helper.rb
140
- - test/dummy/Rakefile
137
+ - test/dummy/app/assets/javascripts/application.js
138
+ - test/dummy/app/assets/stylesheets/application.css
139
+ - test/dummy/README.rdoc
141
140
  - test/realtime-validations_test.rb
141
+ - test/test_helper.rb
@@ -1,96 +0,0 @@
1
- $(document).ready(rt_validations_bind_fields);
2
-
3
- function rt_validations_bind_fields()
4
- {
5
- $('form[validation="true"] :input').each(function(i, field) {
6
- rt_validations_bind_field(field);
7
- });
8
- }
9
-
10
- function rt_validations_bind_field(field)
11
- {
12
- var field_to_validate = $('#' + field.id);
13
- if (rt_validations_should_bind_field(field_to_validate)) {
14
- field_to_validate.blur(rt_validations_bind_field_on_blur);
15
- }
16
- }
17
-
18
- function rt_validations_should_bind_field(field)
19
- {
20
- var validate = field.attr('validate');
21
- if ($.isEmptyObject(validate)) {
22
- return true;
23
- }
24
- return validate == 'true';
25
- }
26
-
27
- function rt_validations_bind_field_on_blur()
28
- {
29
- var field = $(this);
30
- var form_to_validate = $('form[validation="true"]');
31
- var validation_path = rt_validations_path(form_to_validate);
32
- var model = form_to_validate.attr('model');
33
- var field_name = field.attr('name');
34
- var matched = field_name.match(/(\w+)\[(\w+)_confirmation\]/);
35
- var data_to_send = null;
36
- var current_value = field.val();
37
-
38
- if (matched) {
39
- var field_canonical_namespace = matched[1];
40
- var field_canonical_name = matched[2];
41
- var validation_value = $('#' + field_canonical_namespace + '_' + field_canonical_name).val();
42
- data_to_send = { field: field_name.replace("_confirmation", ""), value: current_value,
43
- validates: validation_value, model: model };
44
- } else {
45
- data_to_send = { field: field_name, value: current_value, model: model };
46
- }
47
-
48
- var custom_data_to_send = rt_validations_custom_fields();
49
- $.extend(data_to_send, custom_data_to_send);
50
-
51
- $.post(validation_path, data_to_send, function(data) {
52
- if ($.isEmptyObject(data.errors)) {
53
- rt_validations_hide_warning_message(field);
54
- } else {
55
- rt_validations_show_warning_message(field, data.errors);
56
- }
57
- });
58
- }
59
-
60
- function rt_validations_path(form)
61
- {
62
- return '/validations' + form.attr('action');
63
- }
64
-
65
- function rt_validations_show_warning_message(field, errors)
66
- {
67
- var validation_errors = field.attr('validation-errors');
68
- if (!$.isEmptyObject(validation_errors) && (validation_errors.toString() == errors.toString())) {
69
- return;
70
- }
71
- field.attr('valid', false);
72
- field.attr('validation-errors', errors);
73
- if ($('#' + field.attr('id') + '_error').length) {
74
- $('#' + field.attr('id') + '_error').remove();
75
- }
76
- field.parent().append('<div style="display: none;" id="' + field.attr('id') + '_error" class="field-error">'
77
- + errors.join(', ') +
78
- '<div class="field-error-arrow-border"></div> \
79
- <div class="field-error-arrow"></div> \
80
- </div>');
81
- $('#' + field.attr('id') + '_error').fadeIn('slow');
82
- }
83
-
84
- function rt_validations_hide_warning_message(field)
85
- {
86
- field.attr('valid', true);
87
- field.attr('validation-errors', null);
88
- $('#' + field.attr('id') + '_error').fadeOut('slow', function() {
89
- $(this).remove();
90
- });
91
- }
92
-
93
- $(document).ajaxSend(function(e, xhr, options) {
94
- var token = $("meta[name='csrf-token']").attr("content");
95
- xhr.setRequestHeader("X-CSRF-Token", token);
96
- });
@@ -1,3 +0,0 @@
1
- function rt_validations_custom_fields() {
2
- return {};
3
- }