Fingertips-form-san 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|