Fingertips-form-san 0.2.0 → 0.3.0
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.rdoc +19 -4
- data/lib/form_san.rb +55 -34
- metadata +3 -4
- data/lib/form_san/form_builder.rb +0 -104
data/README.rdoc
CHANGED
@@ -1,12 +1,27 @@
|
|
1
1
|
= Form-San
|
2
2
|
|
3
|
-
Form-San is a lean
|
3
|
+
Form-San is a lean extension for the Rails form builder.
|
4
4
|
|
5
|
-
<%
|
5
|
+
<% form_for(@member, :builder => FormSan::FormBuilder) do |f| %>
|
6
6
|
<% f.fieldset do %>
|
7
7
|
<% f.fields do %>
|
8
|
-
|
9
|
-
|
8
|
+
<%= f.error_messages %>
|
9
|
+
|
10
|
+
<% f.field(:email, :type => :text, :class => 'medium') do %>
|
11
|
+
<p class="hint">You’ll log in using your email address.</p>
|
12
|
+
<% end %>
|
13
|
+
<%= f.field(:password, :type => :password) %>
|
14
|
+
|
15
|
+
<% f.fields_for(@member.artist) do |a| %>
|
16
|
+
<% a.field(:name, :type => :text, :class => 'medium') do %>
|
17
|
+
<p class="hint">Shown on the site.</p>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
10
20
|
<% end %>
|
11
21
|
<% end %>
|
22
|
+
|
23
|
+
<div class="submit">
|
24
|
+
<%= f.submit 'Sign up' %>
|
25
|
+
<%= link_to 'Cancel', root_path, :class => 'cancel' %>
|
26
|
+
</div>
|
12
27
|
<% end %>
|
data/lib/form_san.rb
CHANGED
@@ -1,49 +1,70 @@
|
|
1
|
-
require '
|
1
|
+
require 'action_view/helpers'
|
2
2
|
|
3
3
|
module FormSan
|
4
|
-
class Helpers
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
class FormBuilder < ActionView::Helpers::FormBuilder
|
5
|
+
def fieldset(&block)
|
6
|
+
@template.content_tag(:div, :class => 'fieldset', &block)
|
7
|
+
end
|
8
8
|
|
9
|
-
|
9
|
+
def fields(&block)
|
10
|
+
@template.content_tag(:div, :class => 'fields', &block)
|
11
|
+
end
|
10
12
|
|
11
|
-
def
|
12
|
-
|
13
|
-
|
13
|
+
def error_messages
|
14
|
+
unless @object.errors.count.zero?
|
15
|
+
attributes_with_errors = @object.errors.map { |attribute, _| attribute } - ['base']
|
16
|
+
@template.content_tag(:p, :class => 'errors') do
|
17
|
+
if attributes_with_errors.size > 1
|
18
|
+
@template.concat "Sorry, there were problems with the #{attributes_with_errors.to_sentence}."
|
19
|
+
elsif attributes_with_errors.size == 1
|
20
|
+
@template.concat "Sorry, there was a problem with the #{attributes_with_errors.first}."
|
21
|
+
else
|
22
|
+
@template.concat "#{@object.class} #{@object.errors.on(:base)}."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
else
|
26
|
+
''
|
14
27
|
end
|
15
28
|
end
|
16
29
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
|
30
|
+
def error_message(attribute)
|
31
|
+
unless @object.errors.on(attribute).blank?
|
32
|
+
@template.content_tag(:p, :class => 'notice') do
|
33
|
+
@template.concat ERB::Util.html_escape(@object.errors.on(attribute).mb_chars.capitalize)
|
34
|
+
end
|
35
|
+
else
|
36
|
+
''
|
37
|
+
end
|
21
38
|
end
|
22
39
|
|
23
|
-
def
|
24
|
-
|
40
|
+
def field_without_block(attribute, extra_content=nil, *args)
|
41
|
+
options = args.extract_options!
|
42
|
+
classes = @object.errors.on(attribute) ? 'invalid field' : 'field'
|
43
|
+
|
44
|
+
@template.content_tag(:div, :class => classes) do
|
45
|
+
@template.concat(@template.content_tag(:div, :class => 'label') do
|
46
|
+
@template.concat self.label(attribute, *args)
|
47
|
+
end)
|
48
|
+
@template.concat ActionView::Helpers::InstanceTag.new(@object_name,
|
49
|
+
attribute, self, @object).to_input_field_tag(options.delete(:type), options)
|
50
|
+
@template.concat error_message(attribute)
|
51
|
+
@template.concat extra_content unless extra_content.blank?
|
52
|
+
@template.output_buffer # The block needs to return the current buffer
|
53
|
+
end
|
25
54
|
end
|
26
55
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end.compact
|
34
|
-
attributes.empty? ? '' : " #{attributes.join(' ')}"
|
56
|
+
def field(attribute, *args, &block)
|
57
|
+
if block_given?
|
58
|
+
@template.concat field_without_block(attribute, @template.capture(&block), *args)
|
59
|
+
else
|
60
|
+
field_without_block(attribute, nil, *args)
|
61
|
+
end
|
35
62
|
end
|
36
63
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
def self.method_missing(method, *arguments, &block)
|
43
|
-
if helpers.public_methods(inherited=false).include?(method.to_s)
|
44
|
-
helpers.send(method, *arguments, &block)
|
45
|
-
else
|
46
|
-
super
|
47
|
-
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class ActionView::Helpers::InstanceTag
|
67
|
+
def error_wrapping(html_tag, has_error)
|
68
|
+
html_tag
|
48
69
|
end
|
49
70
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Fingertips-form-san
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manfred Stienstra
|
@@ -13,7 +13,7 @@ date: 2009-03-25 00:00:00 -07:00
|
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description: A
|
16
|
+
description: A form builder for ActionView.
|
17
17
|
email: manfred@fngtps.com
|
18
18
|
executables: []
|
19
19
|
|
@@ -24,7 +24,6 @@ extra_rdoc_files:
|
|
24
24
|
- LICENSE
|
25
25
|
files:
|
26
26
|
- lib/form_san.rb
|
27
|
-
- lib/form_san/form_builder.rb
|
28
27
|
- rails/init.rb
|
29
28
|
- README.rdoc
|
30
29
|
- LICENSE
|
@@ -54,6 +53,6 @@ rubyforge_project:
|
|
54
53
|
rubygems_version: 1.2.0
|
55
54
|
signing_key:
|
56
55
|
specification_version: 2
|
57
|
-
summary:
|
56
|
+
summary: Form-San is a form builder that makes it slightly easier to create fields with labels and validation messages.
|
58
57
|
test_files: []
|
59
58
|
|
@@ -1,104 +0,0 @@
|
|
1
|
-
module FormSan
|
2
|
-
class FormBuilder
|
3
|
-
attr_accessor :output_buffer
|
4
|
-
|
5
|
-
def initialize(output_buffer, record, options={})
|
6
|
-
@output_buffer = output_buffer
|
7
|
-
@record = record
|
8
|
-
@options = options
|
9
|
-
end
|
10
|
-
|
11
|
-
def error_messages(html_options={})
|
12
|
-
unless @record.errors.count.zero?
|
13
|
-
FormSan.content_tag(output_buffer, 'p', html_options.reverse_merge(:class => 'errors')) do
|
14
|
-
attributes_with_errors = @record.errors.map { |attribute, _| attribute } - ['base']
|
15
|
-
if attributes_with_errors.size > 1
|
16
|
-
output_buffer << "Sorry, there were problems with the #{attributes_with_errors.to_sentence}."
|
17
|
-
elsif attributes_with_errors.size == 1
|
18
|
-
output_buffer << "Sorry, there was a problem with the #{attributes_with_errors.first}."
|
19
|
-
else
|
20
|
-
output_buffer << "#{@record.class} #{@record.errors.on(:base)}."
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def error_message(attribute, html_options={})
|
27
|
-
unless @record.errors.on(attribute).blank?
|
28
|
-
FormSan.content_tag(output_buffer, 'p', html_options.reverse_merge(:class => 'notice')) do
|
29
|
-
output_buffer << @record.errors.on(attribute).mb_chars.capitalize
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def fieldset(&block)
|
35
|
-
FormSan.content_tag(output_buffer, 'div', :class => 'fieldset') { block.call(self) }
|
36
|
-
end
|
37
|
-
|
38
|
-
def fields(&block)
|
39
|
-
FormSan.content_tag(output_buffer, 'div', :class => 'fields') { block.call(self) }
|
40
|
-
end
|
41
|
-
|
42
|
-
def field(attribute, options={}, html_options={}, &block)
|
43
|
-
classes = %w(field)
|
44
|
-
classes << 'invalid' if @record.errors.on(attribute)
|
45
|
-
html_options.reverse_merge!(:value => self.class.value_before_type_cast(@record, attribute))
|
46
|
-
FormSan.content_tag(output_buffer, 'div', :class => classes) do
|
47
|
-
label(attribute, options[:humanized])
|
48
|
-
input(attribute, html_options.merge(:type => options[:type]))
|
49
|
-
error_message(attribute)
|
50
|
-
output_buffer << block.call if block_given?
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def label(attribute, humanized_attribute=nil, html_options={}, &block)
|
55
|
-
humanized_attribute ||= @record.class.human_attribute_name(attribute.to_s)
|
56
|
-
if block_given?
|
57
|
-
FormSan.content_tag(output_buffer, 'label', html_options) do
|
58
|
-
block.call(self)
|
59
|
-
output_buffer << " #{humanized_attribute}"
|
60
|
-
end
|
61
|
-
else
|
62
|
-
html_options[:for] ||= "#{@record.class.name.downcase}_#{attribute}"
|
63
|
-
FormSan.content_tag(output_buffer, 'div', :class => 'label') do
|
64
|
-
FormSan.content_tag(output_buffer, 'label', html_options) do
|
65
|
-
output_buffer << humanized_attribute
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def input(attribute, html_options={})
|
72
|
-
html_options.reverse_merge!(
|
73
|
-
:id => "#{@record.class.name.downcase}_#{attribute}",
|
74
|
-
:name => "#{@record.class.name.downcase}[#{attribute}]"
|
75
|
-
)
|
76
|
-
FormSan.tag(output_buffer, 'input', html_options)
|
77
|
-
end
|
78
|
-
|
79
|
-
def text_field(attribute, html_options={})
|
80
|
-
input(attribute, html_options.reverse_merge(:type => 'text'))
|
81
|
-
end
|
82
|
-
|
83
|
-
def password_field(attribute, html_options={})
|
84
|
-
input(attribute, html_options.reverse_merge(:type => 'password'))
|
85
|
-
end
|
86
|
-
|
87
|
-
def submit(label, html_options={})
|
88
|
-
html_options.reverse_merge!(
|
89
|
-
:value => label,
|
90
|
-
:type => 'submit'
|
91
|
-
)
|
92
|
-
FormSan.tag(output_buffer, 'input', html_options)
|
93
|
-
end
|
94
|
-
|
95
|
-
def self.value_before_type_cast(object, attribute)
|
96
|
-
if object.respond_to?("#{attribute}_before_type_cast")
|
97
|
-
object.send("#{attribute}_before_type_cast")
|
98
|
-
else
|
99
|
-
object.send(attribute)
|
100
|
-
end
|
101
|
-
rescue NoMethodError
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|