realtime-validations 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- }