better_form 0.5.1 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
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
-