form-bootstrap 0.0.1 → 0.0.2
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 +47 -26
- data/lib/form-bootstrap/builder.rb +16 -19
- data/lib/form-bootstrap/helper.rb +11 -1
- data/lib/form-bootstrap/version.rb +1 -1
- data/test/dummy/config/application.rb +0 -1
- data/test/form-bootstrap_test.rb +62 -14
- metadata +5 -5
data/README.md
CHANGED
@@ -28,57 +28,78 @@ Install the gem
|
|
28
28
|
|
29
29
|
bundle
|
30
30
|
|
31
|
-
Add the following to application.rb
|
32
31
|
|
33
|
-
|
32
|
+
Example Form
|
33
|
+
------------
|
34
34
|
|
35
|
+
<%= form_bootstrap_for(@user, help: :block) do |f| %>
|
36
|
+
<fieldset>
|
37
|
+
<legend>Sign Up Today!</legend>
|
38
|
+
<%= f.alert_message "Please fix the errors below." %>
|
35
39
|
|
36
|
-
|
37
|
-
|
40
|
+
<%= f.text_field :email, autofocus: :true %>
|
41
|
+
<%= f.password_field :password, help: 'Must be at least 6 characters long' %>
|
42
|
+
<%= f.password_field :password_confirmation, label: 'Confirm Password' %>
|
43
|
+
<%= f.actions 'Sign Up' %>
|
44
|
+
</fieldset>
|
45
|
+
<% end %>
|
38
46
|
|
39
|
-
|
40
|
-
%fieldset
|
41
|
-
%legend
|
42
|
-
Sign Up
|
43
|
-
|
44
|
-
= f.error_message "Please fix the errors below."
|
45
|
-
|
46
|
-
= f.text_field :email, label: 'Email Address'
|
47
|
-
= f.password_field :password, label: 'Password', help: 'Minimum 6 characters'
|
48
|
-
= f.actions 'Sign Up'
|
47
|
+

|
49
48
|
|
50
49
|
|
51
|
-
Example
|
52
|
-
|
50
|
+
Example HTML
|
51
|
+
------------
|
53
52
|
|
54
53
|
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
|
55
54
|
...
|
56
55
|
<fieldset>
|
57
|
-
<legend>
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
<div class="clearfix ">
|
56
|
+
<legend>Sign Up Today!</legend>
|
57
|
+
|
58
|
+
<div class="clearfix">
|
62
59
|
<label for="user_email">Email</label>
|
63
60
|
<div class="input">
|
64
61
|
<input id="user_email" name="user[email]" size="30" type="text" />
|
65
62
|
</div>
|
66
63
|
</div>
|
67
|
-
|
68
|
-
<div class="clearfix ">
|
64
|
+
<div class="clearfix">
|
69
65
|
<label for="user_password">Password</label>
|
70
66
|
<div class="input">
|
71
67
|
<input id="user_password" name="user[password]" size="30" type="password" />
|
72
|
-
<span class="help-
|
68
|
+
<span class="help-block">Must be at least 6 characters long</span>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
<div class="clearfix">
|
72
|
+
<label for="user_password_confirmation">Confirm Password</label>
|
73
|
+
<div class="input">
|
74
|
+
<input id="user_password_confirmation" name="user[password_confirmation]" size="30" type="password" />
|
73
75
|
</div>
|
74
76
|
</div>
|
75
|
-
|
76
77
|
<div class="actions">
|
77
78
|
<input class="btn primary" name="commit" type="submit" value="Sign Up" />
|
78
79
|
</div>
|
79
80
|
</fieldset>
|
80
81
|
</form>
|
81
|
-
|
82
|
+
|
83
|
+
|
84
|
+
Errors
|
85
|
+
------
|
86
|
+
|
87
|
+
When a validation error is triggered, the field will be outlined and the
|
88
|
+
error will be displayed next to the field. Rails normally wraps fields
|
89
|
+
in a div (field_with_errors), but this behavior is suppressed when `form_bootstrap_for` is called.
|
90
|
+
|
91
|
+

|
92
|
+
|
93
|
+
|
94
|
+
Options
|
95
|
+
-------
|
96
|
+
|
97
|
+
By default, help (and error) messages will be placed to the right of the
|
98
|
+
input field. If you want to place them under the input field, pass the option
|
99
|
+
`help: :block`:
|
100
|
+
|
101
|
+
<%= form_bootstrap_for @user, help: :block do |f| %>
|
102
|
+
|
82
103
|
|
83
104
|
Credits
|
84
105
|
-------
|
@@ -2,17 +2,20 @@ module FormBootstrap
|
|
2
2
|
class Builder < ActionView::Helpers::FormBuilder
|
3
3
|
delegate :content_tag, to: :@template
|
4
4
|
|
5
|
+
def initialize(object_name, object, template, options, proc)
|
6
|
+
super
|
7
|
+
@help_css = (options[:help].try(:to_sym) == :block) ? 'help-block' : 'help-inline'
|
8
|
+
end
|
9
|
+
|
5
10
|
%w{text_field text_area password_field collection_select}.each do |method_name|
|
6
11
|
define_method(method_name) do |name, *args|
|
7
|
-
options = args.extract_options
|
12
|
+
options = args.extract_options!.stringify_keys
|
8
13
|
content_tag :div, class: "clearfix#{(' error' if object.errors[name].any?)}" do
|
9
|
-
|
14
|
+
label(name, options['label']) +
|
10
15
|
content_tag(:div, class: 'input') do
|
11
|
-
help =
|
12
|
-
|
13
|
-
|
14
|
-
help
|
15
|
-
end
|
16
|
+
help = object.errors[name].any? ? object.errors[name].join(', ') : options['help']
|
17
|
+
help = content_tag(:span, class: @help_css) { help } if help
|
18
|
+
super(name, *args, options.except('label', 'help')) + help
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
@@ -24,21 +27,15 @@ module FormBootstrap
|
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
27
|
-
def
|
30
|
+
def alert_message(title, *args)
|
31
|
+
options = args.extract_options!
|
32
|
+
css = options[:class] || "alert-message error"
|
33
|
+
|
28
34
|
if object.errors.full_messages.any?
|
29
|
-
content_tag :div, class:
|
30
|
-
|
31
|
-
title
|
32
|
-
end
|
35
|
+
content_tag :div, class: css do
|
36
|
+
title
|
33
37
|
end
|
34
38
|
end
|
35
39
|
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def field_label(name, *args)
|
40
|
-
options = args.extract_options!
|
41
|
-
label(name, options[:label])
|
42
|
-
end
|
43
40
|
end
|
44
41
|
end
|
@@ -2,7 +2,17 @@ module FormBootstrap
|
|
2
2
|
module Helper
|
3
3
|
def form_bootstrap_for(object, options = {}, &block)
|
4
4
|
options[:builder] = FormBootstrap::Builder
|
5
|
-
|
5
|
+
temporarily_disable_field_error_proc do
|
6
|
+
form_for(object, options, &block)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def temporarily_disable_field_error_proc
|
11
|
+
original_proc = ActionView::Base.field_error_proc
|
12
|
+
ActionView::Base.field_error_proc = proc { |input, instance| input }
|
13
|
+
yield
|
14
|
+
ensure
|
15
|
+
ActionView::Base.field_error_proc = original_proc
|
6
16
|
end
|
7
17
|
end
|
8
18
|
end
|
data/test/form-bootstrap_test.rb
CHANGED
@@ -6,48 +6,96 @@ class FormBootstrapTest < ActionView::TestCase
|
|
6
6
|
@builder = FormBootstrap::Builder.new :user, @user, self, {}, nil
|
7
7
|
end
|
8
8
|
|
9
|
+
test "helper method to wrap form bootstrap builder" do
|
10
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div></form>}
|
11
|
+
assert_equal expected, form_bootstrap_for(@user) { |f| nil }
|
12
|
+
end
|
13
|
+
|
14
|
+
test "alert message is wrapped correctly" do
|
15
|
+
@user.email = nil
|
16
|
+
@user.valid?
|
17
|
+
expected = %{<div class="alert-message error">Please fix the following errors:</div>}
|
18
|
+
assert_equal expected, @builder.alert_message('Please fix the following errors:')
|
19
|
+
end
|
20
|
+
|
21
|
+
test "changing the class name for the alert message" do
|
22
|
+
@user.email = nil
|
23
|
+
@user.valid?
|
24
|
+
expected = %{<div class="my-css-class">Please fix the following errors:</div>}
|
25
|
+
assert_equal expected, @builder.alert_message('Please fix the following errors:', class: 'my-css-class')
|
26
|
+
end
|
27
|
+
|
9
28
|
test "text fields are wrapped correctly" do
|
10
|
-
expected = %{<div class="clearfix"><label for="user_email">Email</label><div class="input"><input id="user_email" name="user[email]" size="30" type="text" value="steve@example.com"
|
29
|
+
expected = %{<div class="clearfix"><label for="user_email">Email</label><div class="input"><input id="user_email" name="user[email]" size="30" type="text" value="steve@example.com" /></div></div>}
|
11
30
|
assert_equal expected, @builder.text_field(:email)
|
12
31
|
end
|
13
32
|
|
14
33
|
test "password fields are wrapped correctly" do
|
15
|
-
expected = %{<div class="clearfix"><label for="user_password">Password</label><div class="input"><input id="user_password" name="user[password]" size="30" type="text" value="secret"
|
34
|
+
expected = %{<div class="clearfix"><label for="user_password">Password</label><div class="input"><input id="user_password" name="user[password]" size="30" type="text" value="secret" /></div></div>}
|
16
35
|
assert_equal expected, @builder.text_field(:password)
|
17
36
|
end
|
18
37
|
|
19
38
|
test "text areas are wrapped correctly" do
|
20
|
-
expected = %{<div class="clearfix"><label for="user_comments">Comments</label><div class="input"><textarea cols="40" id="user_comments" name="user[comments]" rows="20">my comment</textarea
|
39
|
+
expected = %{<div class="clearfix"><label for="user_comments">Comments</label><div class="input"><textarea cols="40" id="user_comments" name="user[comments]" rows="20">my comment</textarea></div></div>}
|
21
40
|
assert_equal expected, @builder.text_area(:comments)
|
22
41
|
end
|
23
42
|
|
24
43
|
test "selects are wrapped correctly" do
|
25
|
-
expected = %{<div class="clearfix"><label for="user_status">Status</label><div class="input"><select id="user_status" name="user[status]"></select
|
44
|
+
expected = %{<div class="clearfix"><label for="user_status">Status</label><div class="input"><select id="user_status" name="user[status]"></select></div></div>}
|
26
45
|
assert_equal expected, @builder.collection_select(:status, [], :id, :name)
|
27
46
|
end
|
28
47
|
|
48
|
+
test "changing the label text" do
|
49
|
+
expected = %{<div class="clearfix"><label for="user_email">Email Address</label><div class="input"><input id="user_email" name="user[email]" size="30" type="text" value="steve@example.com" /></div></div>}
|
50
|
+
assert_equal expected, @builder.text_field(:email, label: 'Email Address')
|
51
|
+
end
|
52
|
+
|
53
|
+
test "passing :help to a field displays it inline" do
|
54
|
+
expected = %{<div class="clearfix"><label for="user_email">Email</label><div class="input"><input id="user_email" name="user[email]" size="30" type="text" value="steve@example.com" /><span class="help-inline">This is required</span></div></div>}
|
55
|
+
assert_equal expected, @builder.text_field(:email, help: 'This is required')
|
56
|
+
end
|
57
|
+
|
58
|
+
test "passing other options to a field get passed through" do
|
59
|
+
expected = %{<div class="clearfix"><label for="user_email">Email</label><div class="input"><input autofocus="autofocus" id="user_email" name="user[email]" size="30" type="text" value="steve@example.com" /></div></div>}
|
60
|
+
assert_equal expected, @builder.text_field(:email, autofocus: true)
|
61
|
+
end
|
62
|
+
|
29
63
|
test "actions are wrapped correctly" do
|
30
64
|
expected = %{<div class="actions"><input class="btn primary" name="commit" type="submit" value="Submit" /></div>}
|
31
65
|
assert_equal expected, @builder.actions('Submit')
|
32
66
|
end
|
33
67
|
|
34
|
-
test "
|
68
|
+
test "passing :help :block to the form builder" do
|
69
|
+
output = form_bootstrap_for(@user, help: :block) do |f|
|
70
|
+
f.text_field(:email, help: 'This is required')
|
71
|
+
end
|
72
|
+
|
73
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="clearfix"><label for="user_email">Email</label><div class="input"><input id="user_email" name="user[email]" size="30" type="text" value="steve@example.com" /><span class="help-block">This is required</span></div></div></form>}
|
74
|
+
assert_equal expected, output
|
75
|
+
end
|
76
|
+
|
77
|
+
test "the field contains the error and is not wrapped in div.field_with_errors when form_bootstrap_for is used" do
|
35
78
|
@user.email = nil
|
36
79
|
@user.valid?
|
37
|
-
|
38
|
-
|
80
|
+
|
81
|
+
output = form_bootstrap_for(@user, help: :block) do |f|
|
82
|
+
f.text_field(:email, help: 'This is required')
|
83
|
+
end
|
84
|
+
|
85
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="clearfix error"><label for="user_email">Email</label><div class="input"><input id="user_email" name="user[email]" size="30" type="text" /><span class="help-block">can't be blank, is too short (minimum is 5 characters)</span></div></div></form>}
|
86
|
+
assert_equal expected, output
|
39
87
|
end
|
40
88
|
|
41
|
-
test "
|
89
|
+
test "the field is wrapped with div.field_with_errors when form_for is used" do
|
42
90
|
@user.email = nil
|
43
91
|
@user.valid?
|
44
|
-
expected = %{<div class="clearfix error"><div class="field_with_errors"><label for="user_email">Email</label></div><div class="input"><div class="field_with_errors"><input id="user_email" name="user[email]" size="30" type="text" /></div><span class="help-inline">can't be blank, is too short (minimum is 5 characters)</span></div></div>}
|
45
|
-
assert_equal expected, @builder.text_field(:email)
|
46
|
-
end
|
47
92
|
|
48
|
-
|
49
|
-
|
50
|
-
|
93
|
+
output = form_for(@user, builder: FormBootstrap::Builder, help: :block) do |f|
|
94
|
+
f.text_field(:email, help: 'This is required')
|
95
|
+
end
|
96
|
+
|
97
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="clearfix error"><div class="field_with_errors"><label for="user_email">Email</label></div><div class="input"><div class="field_with_errors"><input id="user_email" name="user[email]" size="30" type="text" /></div><span class="help-block">can't be blank, is too short (minimum is 5 characters)</span></div></div></form>}
|
98
|
+
assert_equal expected, output
|
51
99
|
end
|
52
100
|
end
|
53
101
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: form-bootstrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-06 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70259696646240 !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: *70259696646240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sqlite3
|
27
|
-
requirement: &
|
27
|
+
requirement: &70259696643700 !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: *70259696643700
|
36
36
|
description: Provides a builder that makes it super easy to take advantage of Twitter
|
37
37
|
Bootstrap forms styles.
|
38
38
|
email:
|