html5_validators 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.rdoc +100 -0
- data/Rakefile +2 -0
- data/html5_validators.gemspec +21 -0
- data/lib/html5_validators.rb +16 -0
- data/lib/html5_validators/action_view/form_helpers.rb +17 -0
- data/lib/html5_validators/active_model/helper_methods.rb +29 -0
- data/lib/html5_validators/active_model/initializer_monkey_patches.rb +21 -0
- data/lib/html5_validators/version.rb +3 -0
- metadata +75 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
= HTML5Validators
|
2
|
+
|
3
|
+
Automatic client-side validation using HTML5 Form Validation
|
4
|
+
|
5
|
+
|
6
|
+
== What is this?
|
7
|
+
|
8
|
+
html5_validators is a gem/plugin for Rails 3 that enables client-side validation using ActiveModel + HTML5
|
9
|
+
|
10
|
+
|
11
|
+
== Features
|
12
|
+
|
13
|
+
* PresenceValidator => requried
|
14
|
+
|
15
|
+
Model:
|
16
|
+
class User
|
17
|
+
include ActiveModel::Validations
|
18
|
+
validates_presence_of :name
|
19
|
+
end
|
20
|
+
|
21
|
+
View:
|
22
|
+
<%= f.text_field :name %>
|
23
|
+
|
24
|
+
HTML:
|
25
|
+
<input id="user_name" name="user[name]" required="required" type="text" />
|
26
|
+
|
27
|
+
SPEC:
|
28
|
+
http://dev.w3.org/html5/spec/Overview.html#attr-input-requiredhttp://dev.w3.org/html5/spec/Overview.html#attr-input-required
|
29
|
+
|
30
|
+
* LengthValidator => maxlength
|
31
|
+
|
32
|
+
Model:
|
33
|
+
class User
|
34
|
+
include ActiveModel::Validations
|
35
|
+
validates_length_of :name, :maximum => 5
|
36
|
+
end
|
37
|
+
|
38
|
+
View:
|
39
|
+
<%= f.text_field :name %>
|
40
|
+
|
41
|
+
HTML:
|
42
|
+
<input id="user_name" maxlength="5" name="user[name]" size="5" type="text" />
|
43
|
+
|
44
|
+
SPEC:
|
45
|
+
http://dev.w3.org/html5/spec/Overview.html#attr-input-maxlength
|
46
|
+
|
47
|
+
* NumericalityValidator => max, min
|
48
|
+
|
49
|
+
Model:
|
50
|
+
class User
|
51
|
+
include ActiveModel::Validations
|
52
|
+
validates_numericality_of :age, :greater_than_or_equal_to => 20
|
53
|
+
end
|
54
|
+
|
55
|
+
View: (be sure to use number_field)
|
56
|
+
<%= f.number_field :age %>
|
57
|
+
|
58
|
+
HTML:
|
59
|
+
<input id="user_age" min="20" name="user[age]" size="30" type="number" />
|
60
|
+
|
61
|
+
SPEC:
|
62
|
+
http://dev.w3.org/html5/spec/Overview.html#attr-input-max
|
63
|
+
http://dev.w3.org/html5/spec/Overview.html#attr-input-min
|
64
|
+
|
65
|
+
|
66
|
+
* And more (coming soon...?)
|
67
|
+
|
68
|
+
|
69
|
+
== Supported versions
|
70
|
+
|
71
|
+
* Ruby 1.8.7, 1.9.2, 1.9.3 (trunk)
|
72
|
+
|
73
|
+
* Rails 3.0.x, 3.1.beta1, 3.1 (edge)
|
74
|
+
|
75
|
+
* HTML5 compatible browsers
|
76
|
+
|
77
|
+
|
78
|
+
== Installation
|
79
|
+
|
80
|
+
Put this line into your Gemfile:
|
81
|
+
gem 'html5_validators'
|
82
|
+
|
83
|
+
Then bundle:
|
84
|
+
% bundle
|
85
|
+
|
86
|
+
|
87
|
+
== Notes
|
88
|
+
|
89
|
+
When accessed by an HTML5 incompatible lagacy brwoser, these extra attributes will just be ignored.
|
90
|
+
|
91
|
+
|
92
|
+
== Todo
|
93
|
+
|
94
|
+
* specs
|
95
|
+
* more validations
|
96
|
+
|
97
|
+
|
98
|
+
== Copyright
|
99
|
+
|
100
|
+
Copyright (c) 2011 Asakusa.rb. See LICENSE.txt for further details.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'html5_validators/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'html5_validators'
|
7
|
+
s.version = Html5Validators::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ['Akira Matsuda']
|
10
|
+
s.email = ['ronnie@dio.jp']
|
11
|
+
s.homepage = 'https://github.com/amatsuda/html5_validators'
|
12
|
+
s.summary = 'Automatic client side validation using HTML5 Form Validation'
|
13
|
+
s.description = 'A gem/plugin for Rails 3 that enables client-side validation using ActiveModel + HTML5'
|
14
|
+
|
15
|
+
s.rubyforge_project = 'html5_validators'
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ['lib']
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
module Html5Validators
|
4
|
+
class Railtie < ::Rails::Railtie #:nodoc:
|
5
|
+
initializer 'html5_validators' do |app|
|
6
|
+
ActiveSupport.on_load(:active_record) do
|
7
|
+
require File.join(File.dirname(__FILE__), 'html5_validators/active_model/helper_methods')
|
8
|
+
# see: https://github.com/rails/rails/pull/1085
|
9
|
+
require File.join(File.dirname(__FILE__), 'html5_validators/active_model/initializer_monkey_patches')
|
10
|
+
end
|
11
|
+
ActiveSupport.on_load(:action_view) do
|
12
|
+
require File.join(File.dirname(__FILE__), 'html5_validators/action_view/form_helpers')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ActionView
|
2
|
+
module Helpers
|
3
|
+
class InstanceTag
|
4
|
+
def to_input_field_tag_with_html5_attributes(field_type, options = {})
|
5
|
+
if object.class.ancestors.include?(ActiveModel::Validations)
|
6
|
+
options["required"] ||= object.class.attribute_required?(method_name)
|
7
|
+
options["maxlength"] ||= object.class.attribute_maxlength(method_name)
|
8
|
+
options["max"] ||= object.class.attribute_max(method_name)
|
9
|
+
options["min"] ||= object.class.attribute_min(method_name)
|
10
|
+
end
|
11
|
+
to_input_field_tag_without_html5_attributes field_type, options
|
12
|
+
end
|
13
|
+
|
14
|
+
alias_method_chain :to_input_field_tag, :html5_attributes
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActiveModel
|
2
|
+
module Validations
|
3
|
+
module HelperMethods
|
4
|
+
def attribute_required?(attribute)
|
5
|
+
self.validators.grep(PresenceValidator).any? do |v|
|
6
|
+
v.attributes.include?(attribute.to_sym) && (v.options.keys & [:if, :unless]).empty?
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def attribute_maxlength(attribute)
|
11
|
+
self.validators.grep(LengthValidator).select {|v|
|
12
|
+
v.attributes.include?(attribute.to_sym) && (v.options.keys & [:maximum, :is]).any? && (v.options.keys & [:if, :unless, :allow_nil, :allow_blank, :tokenizer]).empty?
|
13
|
+
}.map {|v| v.options.slice(:maximum, :is)}.map(&:values).flatten.max
|
14
|
+
end
|
15
|
+
|
16
|
+
def attribute_max(attribute)
|
17
|
+
self.validators.grep(NumericalityValidator).select {|v|
|
18
|
+
v.attributes.include?(attribute.to_sym) && (v.options.keys & [:less_than, :less_than_or_equal_to]).any? && (v.options.keys & [:if, :unless, :allow_nil, :allow_blank]).empty?
|
19
|
+
}.map {|v| v.options.slice(:less_than, :less_than_or_equal_to)}.map(&:values).flatten.max
|
20
|
+
end
|
21
|
+
|
22
|
+
def attribute_min(attribute)
|
23
|
+
self.validators.grep(NumericalityValidator).select {|v|
|
24
|
+
v.attributes.include?(attribute.to_sym) && (v.options.keys & [:greater_than, :greater_than_or_equal_to]).any? && (v.options.keys & [:if, :unless, :allow_nil, :allow_blank]).empty?
|
25
|
+
}.map {|v| v.options.slice(:greater_than, :greater_than_or_equal_to)}.map(&:values).flatten.min
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ActiveModel
|
2
|
+
module Validations
|
3
|
+
class LengthValidator
|
4
|
+
def initialize(options)
|
5
|
+
if range = (options.delete(:in) || options.delete(:within))
|
6
|
+
raise ArgumentError, ":in and :within must be a Range" unless range.is_a?(Range)
|
7
|
+
options[:minimum], options[:maximum] = range.begin, range.end
|
8
|
+
options[:maximum] -= 1 if range.exclude_end?
|
9
|
+
end
|
10
|
+
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class NumericalityValidator
|
16
|
+
def initialize(options)
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: html5_validators
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Akira Matsuda
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-05-16 00:00:00 Z
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: A gem/plugin for Rails 3 that enables client-side validation using ActiveModel + HTML5
|
22
|
+
email:
|
23
|
+
- ronnie@dio.jp
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- Gemfile
|
33
|
+
- README.rdoc
|
34
|
+
- Rakefile
|
35
|
+
- html5_validators.gemspec
|
36
|
+
- lib/html5_validators.rb
|
37
|
+
- lib/html5_validators/action_view/form_helpers.rb
|
38
|
+
- lib/html5_validators/active_model/helper_methods.rb
|
39
|
+
- lib/html5_validators/active_model/initializer_monkey_patches.rb
|
40
|
+
- lib/html5_validators/version.rb
|
41
|
+
homepage: https://github.com/amatsuda/html5_validators
|
42
|
+
licenses: []
|
43
|
+
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
hash: 3
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
requirements: []
|
68
|
+
|
69
|
+
rubyforge_project: html5_validators
|
70
|
+
rubygems_version: 1.8.2
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: Automatic client side validation using HTML5 Form Validation
|
74
|
+
test_files: []
|
75
|
+
|