better_form 0.5.1 → 0.6.1
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/README.md +94 -0
- data/lib/better_form/builder.rb +39 -13
- data/lib/better_form/version.rb +1 -1
- data/lib/better_form/view_helper.rb +7 -0
- metadata +21 -30
data/README.md
CHANGED
@@ -0,0 +1,94 @@
|
|
1
|
+
better_form Readme
|
2
|
+
==================
|
3
|
+
|
4
|
+
A Rails 3 gem to build DRY forms with Javascript validation.
|
5
|
+
|
6
|
+
* Javascript validates form fields as they are completed, using your `ActiveModel` validators
|
7
|
+
* Well-placed validation output
|
8
|
+
* Automatic label generation
|
9
|
+
* Form field descriptions
|
10
|
+
|
11
|
+
Links
|
12
|
+
=====
|
13
|
+
|
14
|
+
* Online documentation: [http://rdoc.info/projects/2suggestions/better_form](http://rdoc.info/projects/2suggestions/better_form)
|
15
|
+
* Source code: [http://github.com/2suggestions/better_form](http://github.com/2suggestions/better_form)
|
16
|
+
* Bug/Feature tracking: [http://github.com/2suggestions/better_form/issues](http://github.com/2suggestions/better_form/issues)
|
17
|
+
|
18
|
+
Installation and Usage
|
19
|
+
======================
|
20
|
+
|
21
|
+
Add `better_form` to your Gemfile:
|
22
|
+
|
23
|
+
gem 'better_form'
|
24
|
+
|
25
|
+
And run the usual `bundle install`.
|
26
|
+
|
27
|
+
Use the `better_form_for` method to create a better form:
|
28
|
+
|
29
|
+
= better_form_for @user do |f|
|
30
|
+
|
31
|
+
Create fields using the usual Rails methods:
|
32
|
+
|
33
|
+
= f.text_field :name
|
34
|
+
= f.email_field :email
|
35
|
+
= f.password_field :password
|
36
|
+
|
37
|
+
Labels
|
38
|
+
------
|
39
|
+
|
40
|
+
Fields will automatically have labels generated for them, with the label text defaulting to the attribute that the field is for:
|
41
|
+
|
42
|
+
= f.text_field :name
|
43
|
+
|
44
|
+
<label for='user_name'>Name</label>
|
45
|
+
<input type='text' id='user_name' name='user[name]' />
|
46
|
+
|
47
|
+
To specify your own label text, pass a string as the `:label` option:
|
48
|
+
|
49
|
+
= f.text_field :name, :label => "What shall we call you?"
|
50
|
+
|
51
|
+
<label for='user_name'>What shall we call you?</label>
|
52
|
+
<input type='text' id='user_name' name='user[name]' />
|
53
|
+
|
54
|
+
To skip label generation for a specific field, pass `false` as the `:label` option:
|
55
|
+
|
56
|
+
= f.text_field :name, :label => false
|
57
|
+
|
58
|
+
<input type='text' id='user_name' name='user[name]' />
|
59
|
+
|
60
|
+
You can set the default for the entire form in the same way. Field-level `:label` options will override the default value. For example:
|
61
|
+
|
62
|
+
# Don't generate labels for this form, unless instructed to for a specific field
|
63
|
+
= better_form_for @user, :label => false do |f|
|
64
|
+
= f.text_field :name
|
65
|
+
= f.email_field :email, :label => true
|
66
|
+
= f.password_field :password, :label => 'Pick a strong password'
|
67
|
+
|
68
|
+
<input type='text' id='user_name' name='user[name]' />
|
69
|
+
|
70
|
+
<label for='user_email'>Email</label>
|
71
|
+
<input type='email' id='user_email' name='user[email]' />
|
72
|
+
|
73
|
+
<label for='user_password'>Pick a strong password</label>
|
74
|
+
<input type='password' id='user_password' name='user[password]' />
|
75
|
+
|
76
|
+
Validations
|
77
|
+
-----------
|
78
|
+
|
79
|
+
Fields will automatically have validation data generated for them using the validations defined in your models:
|
80
|
+
|
81
|
+
class User < ActiveRecord::Base
|
82
|
+
validates :name, :presence => true
|
83
|
+
end
|
84
|
+
|
85
|
+
= f.text_field :name
|
86
|
+
|
87
|
+
<label for='user_name'>What shall we call you?</label>
|
88
|
+
<input type='text' id='user_name' name='user[name]' data-validates-presence="Name is required" />
|
89
|
+
|
90
|
+
Setting a custom error message will be reflected in the validation that is generated:
|
91
|
+
|
92
|
+
validates :name, :presence => { :message => 'Please enter your full name' }
|
93
|
+
|
94
|
+
<input type='text' id='user_name' name='user[name]' data-validates-presence="Please enter your full name" />
|
data/lib/better_form/builder.rb
CHANGED
@@ -6,25 +6,47 @@ module BetterForm
|
|
6
6
|
helpers.each do |field_type|
|
7
7
|
define_method(field_type) do |field_name, *args|
|
8
8
|
options = args.extract_options!
|
9
|
-
|
10
|
-
|
9
|
+
|
10
|
+
# Extract the prefix and suffix (if any), and make them html_safe
|
11
|
+
prefix = (options.delete(:prefix) || '').html_safe
|
12
|
+
suffix = (options.delete(:suffix) || '').html_safe
|
13
|
+
description = (options.delete(:description) || '').html_safe
|
14
|
+
|
15
|
+
# Extract the label argument and validate argument
|
11
16
|
label = options.delete(:label)
|
17
|
+
validate = options.delete(:validate)
|
18
|
+
|
19
|
+
error_message = ''.html_safe
|
12
20
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
21
|
+
# If this field is explicitly validated, or this field and the whole form aren't explicitly *not* validated
|
22
|
+
if validate or (validate != false and @template.validate_all? != false)
|
23
|
+
# Generate validations for the field
|
24
|
+
validations = generate_validations(@object, field_name)
|
25
|
+
options.merge!(validations)
|
26
|
+
|
27
|
+
# Add an 'invalid' class to it if it has errors
|
28
|
+
unless @object.errors[field_name].blank?
|
29
|
+
css_classes = options.delete(:class)
|
30
|
+
options.merge!({ :class => "#{css_classes} invalid" })
|
31
|
+
error_message = generate_error(field_name)
|
32
|
+
end
|
17
33
|
end
|
18
34
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
generate_label(field_type, field_name, label) + super(field_name, *(args << options)) + error_message
|
23
|
-
elsif @template.label_all? == false
|
24
|
-
super(field_name, *(args << options)) + error_message
|
35
|
+
# Generate a label if necessary
|
36
|
+
if (label == false) or (label == nil and @template.label_all? == false)
|
37
|
+
label = ''.html_safe
|
25
38
|
else
|
26
|
-
generate_label(field_type, field_name, label)
|
39
|
+
label = generate_label(field_type, field_name, label)
|
27
40
|
end
|
41
|
+
|
42
|
+
# Generate the field itself
|
43
|
+
field = super(field_name, *(args << options))
|
44
|
+
|
45
|
+
# Generate the field description
|
46
|
+
description = generate_description(description)
|
47
|
+
|
48
|
+
# Join all the parts together to make a better form field!
|
49
|
+
return label + content_tag(:span, prefix + field + suffix + description) + error_message
|
28
50
|
end
|
29
51
|
end
|
30
52
|
|
@@ -50,6 +72,10 @@ module BetterForm
|
|
50
72
|
label(method, label_text, options ||= {})
|
51
73
|
end
|
52
74
|
|
75
|
+
def generate_description(description)
|
76
|
+
content_tag(:span, description, :class => 'field-desc') unless description.blank?
|
77
|
+
end
|
78
|
+
|
53
79
|
def generate_error(field_name)
|
54
80
|
content_tag(:span, @object.errors[field_name].join(tag(:br)).html_safe, :class => :error_message)
|
55
81
|
end
|
data/lib/better_form/version.rb
CHANGED
@@ -2,18 +2,25 @@ module BetterForm
|
|
2
2
|
module ViewHelper
|
3
3
|
def better_form_for(record_or_name_or_array, *args, &proc)
|
4
4
|
options = args.extract_options!.reverse_merge(:builder => BetterForm::Builder)
|
5
|
+
options[:class] = "#{options[:class]} better_form"
|
5
6
|
@label_all = options[:label]
|
7
|
+
@validate_all = options[:validate]
|
6
8
|
form_for(record_or_name_or_array, *(args << options), &proc)
|
7
9
|
end
|
8
10
|
|
9
11
|
def better_fields_for(record_or_name_or_array, *args, &proc)
|
10
12
|
options = args.extract_options!.reverse_merge(:builder => BetterForm::Builder)
|
11
13
|
@label_all = options[:label]
|
14
|
+
@validate_all = options[:validate]
|
12
15
|
fields_for(record_or_name_or_array, *(args << options), &proc)
|
13
16
|
end
|
14
17
|
|
15
18
|
def label_all?
|
16
19
|
@label_all
|
17
20
|
end
|
21
|
+
|
22
|
+
def validate_all?
|
23
|
+
@validate_all
|
24
|
+
end
|
18
25
|
end
|
19
26
|
end
|
metadata
CHANGED
@@ -1,62 +1,53 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: better_form
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.1
|
4
5
|
prerelease:
|
5
|
-
version: 0.5.1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Nicholas Firth-McCoy
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-04-28 00:00:00 +10:00
|
12
|
+
date: 2011-05-31 00:00:00.000000000 +10:00
|
14
13
|
default_executable:
|
15
14
|
dependencies: []
|
16
|
-
|
17
15
|
description:
|
18
|
-
email:
|
16
|
+
email:
|
19
17
|
- nicholas@2suggestions.com.au
|
20
18
|
executables: []
|
21
|
-
|
22
19
|
extensions: []
|
23
|
-
|
24
20
|
extra_rdoc_files: []
|
25
|
-
|
26
|
-
files:
|
27
|
-
- lib/better_form/version.rb
|
28
|
-
- lib/better_form/view_helper.rb
|
29
|
-
- lib/better_form/builder.rb
|
21
|
+
files:
|
30
22
|
- lib/better_form.rb
|
23
|
+
- lib/better_form/builder.rb
|
24
|
+
- lib/better_form/view_helper.rb
|
25
|
+
- lib/better_form/version.rb
|
31
26
|
- LICENSE
|
32
27
|
- README.md
|
33
28
|
has_rdoc: true
|
34
29
|
homepage: http://github.com/2suggestions/better_form
|
35
30
|
licenses: []
|
36
|
-
|
37
31
|
post_install_message:
|
38
32
|
rdoc_options: []
|
39
|
-
|
40
|
-
require_paths:
|
33
|
+
require_paths:
|
41
34
|
- lib
|
42
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
36
|
none: false
|
44
|
-
requirements:
|
45
|
-
- -
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
42
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
53
46
|
version: 1.3.6
|
54
47
|
requirements: []
|
55
|
-
|
56
48
|
rubyforge_project:
|
57
|
-
rubygems_version: 1.6.
|
49
|
+
rubygems_version: 1.6.2
|
58
50
|
signing_key:
|
59
51
|
specification_version: 3
|
60
52
|
summary: A Better Rails 3 FormBuilder
|
61
53
|
test_files: []
|
62
|
-
|