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.
- data/app/controllers/realtime_validations/validations_controller.rb +45 -17
- data/lib/generators/realtime_validations/install_generator.rb +1 -1
- data/lib/generators/realtime_validations/templates/realtime_validations.custom.js +3 -0
- data/lib/realtime-validations/version.rb +1 -1
- data/vendor/assets/javascripts/realtime_validations.js +97 -0
- data/{app/assets/stylesheets/realtime_validations/core.css → vendor/assets/stylesheets/realtime_validations.css} +0 -0
- metadata +51 -51
- data/app/assets/javascripts/realtime_validations/core.js +0 -96
- data/lib/generators/realtime_validations/templates/realtime_validations.js +0 -3
@@ -5,25 +5,51 @@ module RealtimeValidations
|
|
5
5
|
include Controller
|
6
6
|
|
7
7
|
def validate
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
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,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
|
+
});
|
File without changes
|
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.
|
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: &
|
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: *
|
24
|
+
version_requirements: *13842960
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sqlite3
|
27
|
-
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: *
|
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
|
-
-
|
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/
|
63
|
-
- test/dummy/config
|
64
|
-
- test/dummy/
|
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/
|
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/
|
70
|
+
- test/dummy/config/initializers/mime_types.rb
|
76
71
|
- test/dummy/config/initializers/backtrace_silencers.rb
|
77
|
-
- test/dummy/
|
78
|
-
- test/dummy/config.
|
79
|
-
- test/dummy/
|
80
|
-
- test/dummy/
|
81
|
-
- test/dummy/
|
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/
|
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.
|
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/
|
118
|
-
- test/dummy/config
|
119
|
-
- test/dummy/
|
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/
|
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/
|
125
|
+
- test/dummy/config/initializers/mime_types.rb
|
131
126
|
- test/dummy/config/initializers/backtrace_silencers.rb
|
132
|
-
- test/dummy/
|
133
|
-
- test/dummy/config.
|
134
|
-
- test/dummy/
|
135
|
-
- test/dummy/
|
136
|
-
- test/dummy/
|
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/
|
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
|
-
});
|