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 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" />
@@ -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
- validations = generate_validations(@object, field_name)
10
- options.merge!(validations)
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
- unless @object.errors[field_name].blank?
14
- css_classes = options.delete(:class)
15
- options.merge!({ :class => "#{css_classes} invalid" })
16
- error_message = generate_error(field_name)
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
- if label == false
20
- super(field_name, *(args << options)) + error_message
21
- elsif label
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) + super(field_name, *(args << options)) + error_message
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
@@ -1,3 +1,3 @@
1
1
  module BetterForm
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.1"
3
3
  end
@@ -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: "0"
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.1
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
-