simple_form 2.1.2 → 2.1.3

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.

Potentially problematic release.


This version of simple_form might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4f641b8e74ebf64e3fb7fe4ebe925c64713eb13
4
- data.tar.gz: e74db71fa1d985a906d520673cf82504470c16dd
3
+ metadata.gz: e0846cac8facbc990fc17731962d98598a2e40ee
4
+ data.tar.gz: 4e1b4b5645eb07f7273b89b4a50007a6cc72fb82
5
5
  SHA512:
6
- metadata.gz: bc974c636d805808f4b5fd47e9eec4c656ae53b680113f03eea075dac24a7607c773e1243ceff8201bced0fc849c752def0130efefe5b9d7a24c6e85fc4e176a
7
- data.tar.gz: f7a7f67d9ce616e8f7697558ca957cf2701641c0a149eb06b0dab2b60ba17833f432f7bdeeaf29312ff7606acf70971dea86b8ec4f19198ff6420aa7421d646e
6
+ metadata.gz: 0aeca7d6cf3e6ea92299c4a55f7483e5f9ef3c49fc9497840cb11109eb57872cebc98b71c49669b5334cd8409dae300e40409fae39c0d9f2634060fdf65fb95c
7
+ data.tar.gz: 7c9fe5310c7403486fbbeeeb2f4633fb9e6987b6c22e663d727e6eacd41f357252a705ac31e5e91cf03575cc053b153f7fa1ff3f31b0545b9ce82ffb34510582
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 2.1.3
2
+
3
+ ### bug fix
4
+ * Fix method reflection for Ruby 2.1+. [@badosu](https://github.com/badosu)
5
+ * Collection input generates `required` attribute if it has `prompt` option. [@nashby](https://github.com/nashby)
6
+ * Use the given name in `input_html` for the hidden field in `collection_check_boxes` [@angelic](https://github.com/angelic)
7
+ * Add "checkbox" class to the label of boolean input when there is no `:label`
8
+ in `generate_additional_classes_for` config option [@nashby](https://github.com/nashby)
9
+ * Support models with digits in their names [@webgago](https://github.com/webgago)
10
+
1
11
  ## 2.1.2
2
12
 
3
13
  ### bug fix
@@ -13,7 +23,7 @@
13
23
  ### enhancements
14
24
  * `input_field` supports components that don't generate tags
15
25
  as `:min_max`, `:maxlength`, `:placeholder`, `:pattern`, `:readonly`.
16
- Closes[#362](https://github.com/plataformatec/simple_form/issues/632).
26
+ Closes [#362](https://github.com/plataformatec/simple_form/issues/632).
17
27
  ([@nashby](https://github.com/nashby))
18
28
  * support for Rails eager loading.
19
29
  Closes [#478](https://github.com/plataformatec/simple_form/issues/478).
data/README.md CHANGED
@@ -35,23 +35,23 @@ Also, if you want to use the country select, you will need the
35
35
  gem 'country_select'
36
36
  ```
37
37
 
38
- ### Twitter Bootstrap
38
+ ### Bootstrap
39
39
 
40
- **SimpleForm** 2.0 can be easily integrated to the [Twitter Bootstrap](http://twitter.github.com/bootstrap).
40
+ **Simple Form** can be easily integrated to the [Bootstrap](http://getbootstrap.com/2.3.2/) 2.3.
41
41
  To do that you have to use the `bootstrap` option in the install generator, like this:
42
42
 
43
43
  ```console
44
44
  rails generate simple_form:install --bootstrap
45
45
  ```
46
46
 
47
- You have to be sure that you added a copy of the [Twitter Bootstrap](http://twitter.github.com/bootstrap)
47
+ You have to be sure that you added a copy of the [Bootstrap](http://getbootstrap.com/2.3.2/)
48
48
  assets on your application.
49
49
 
50
50
  For more information see the generator output, our
51
51
  [example application code](https://github.com/rafaelfranca/simple_form-bootstrap) and
52
52
  [the live example app](http://simple-form-bootstrap.plataformatec.com.br/).
53
53
 
54
- **NOTE**: **SimpleForm** integration requires Twitter Bootstrap version 2.0 or higher.
54
+ **NOTE**: **SimpleForm** integration requires Twitter Bootstrap version 2.0 up to 2.3.
55
55
 
56
56
  ### Zurb Foundation 3
57
57
 
@@ -163,6 +163,13 @@ And of course, the `required` property of any input can be overwritten as needed
163
163
  <% end %>
164
164
  ```
165
165
 
166
+ By default, SimpleForm will look at the column type in the database and use an
167
+ appropriate input for the column. For example, a column created with type
168
+ `:text` in the database will use a `textarea` input by default. See the section
169
+ [Available input types and defaults for each column
170
+ type](https://github.com/plataformatec/simple_form#available-input-types-and-defaults-for-each-column-type)
171
+ for a complete list of defaults.
172
+
166
173
  **SimpleForm** also lets you overwrite the default input type it creates:
167
174
 
168
175
  ```erb
@@ -176,7 +183,7 @@ And of course, the `required` property of any input can be overwritten as needed
176
183
  ```
177
184
 
178
185
  So instead of a checkbox for the *accepts* attribute, you'll have a pair of radio buttons with yes/no
179
- labels and a text area instead of a text field for the description. You can also render boolean
186
+ labels and a textarea instead of a text field for the description. You can also render boolean
180
187
  attributes using `:as => :select` to show a dropdown.
181
188
 
182
189
  It is also possible to give the `:disabled` option to **SimpleForm**, and it'll automatically mark
@@ -289,7 +296,7 @@ f.input :shipping_country, :priority => [ "Brazil" ], :collection => [ "Australi
289
296
 
290
297
  ### Associations
291
298
 
292
- To deal with associations, **SimpleForm** can generate select inputs, a series of radios buttons or check boxes.
299
+ To deal with associations, **SimpleForm** can generate select inputs, a series of radios buttons or checkboxes.
293
300
  Lets see how it works: imagine you have a user model that belongs to a company and has_and_belongs_to_many
294
301
  roles. The structure would be something like:
295
302
 
@@ -321,7 +328,7 @@ Now we have the user form:
321
328
 
322
329
  Simple enough, right? This is going to render a `:select` input for choosing the `:company`, and another
323
330
  `:select` input with `:multiple` option for the `:roles`. You can, of course, change it to use radio
324
- buttons and check boxes as well:
331
+ buttons and checkboxes as well:
325
332
 
326
333
  ```ruby
327
334
  f.association :company, :as => :radio_buttons
@@ -408,7 +415,7 @@ end
408
415
 
409
416
  #### Collection Check Boxes
410
417
 
411
- Creates a collection of check boxes with labels associated (same API as `collection_select`):
418
+ Creates a collection of checkboxes with labels associated (same API as `collection_select`):
412
419
 
413
420
  ```ruby
414
421
  form_for @user do |f|
@@ -433,36 +440,36 @@ form_for @user do |f|
433
440
  end
434
441
  ```
435
442
 
436
- ## Mappings/Inputs available
437
-
438
- **SimpleForm** comes with a lot of default mappings:
439
-
440
- ```text
441
- Mapping Input Column Type
442
-
443
- boolean check box boolean
444
- string text field string
445
- email email field string with name matching "email"
446
- url url field string with name matching "url"
447
- tel tel field string with name matching "phone"
448
- password password field string with name matching "password"
449
- search search -
450
- text text area text
451
- file file field string, responding to file methods
452
- hidden hidden field -
453
- integer number field integer
454
- float number field float
455
- decimal number field decimal
456
- range range field -
457
- datetime datetime select datetime/timestamp
458
- date date select date
459
- time time select time
460
- select collection select belongs_to/has_many/has_and_belongs_to_many associations
461
- radio_buttons collection radio buttons belongs_to
462
- check_boxes collection check boxes has_many/has_and_belongs_to_many associations
463
- country country select string with name matching "country"
464
- time_zone time zone select string with name matching "time_zone"
465
- ```
443
+ ## Available input types and defaults for each column type
444
+
445
+ The following table shows the html element you will get for each attribute
446
+ according to its database definition. These defaults can be changed by
447
+ specifying the helper method in the column `Mapping` as the `as:` option.
448
+
449
+ Mapping | Generated HTML Element | Database Column Type
450
+ --------------- |:-------------------------------------|:--------------------
451
+ `boolean` | `input[type=checkbox]` | `boolean`
452
+ `string` | `input[type=text]` | `string`
453
+ `email` | `input[type=email]` | `string` with `name =~ /email/`
454
+ `url` | `input[type=url]` | `string` with `name =~ /url/`
455
+ `tel` | `input[type=tel]` | `string` with `name =~ /phone/`
456
+ `password` | `input[type=password]` | `string` with `name =~ /password/`
457
+ `search` | `input[type=search]` | -
458
+ `text` | `textarea` | `text`
459
+ `file` | `input[type=file]` | `string` responding to file methods
460
+ `hidden` | `input[type=hidden]` | -
461
+ `integer` | `input[type=number]` | `integer`
462
+ `float` | `input[type=number]` | `float`
463
+ `decimal` | `input[type=number]` | `decimal`
464
+ `range` | `input[type=range]` | -
465
+ `datetime` | `select` | `datetime/timestamp`
466
+ `date` | `select` | `date`
467
+ `time` | `select` | `time`
468
+ `select` | `select` | `belongs_to`/`has_many`/`has_and_belongs_to_many` associations
469
+ `radio_buttons` | collection of `input[type=radio]` | `belongs_to` associations
470
+ `check_boxes` | collection of `input[type=checkbox]` | `has_many`/`has_and_belongs_to_many` associations
471
+ `country` | `select` (countries as options) | `string` with `name =~ /country/`
472
+ `time_zone` | `select` (timezones as options) | `string` with `name =~ /time_zone/`
466
473
 
467
474
  ## Custom inputs
468
475
 
@@ -483,6 +490,7 @@ And use it in your views:
483
490
  ```ruby
484
491
  f.input :money, :as => :currency
485
492
  ```
493
+ Note, you may have to create the `app/inputs/` directory and restart your webserver.
486
494
 
487
495
  You can also redefine existing **SimpleForm** inputs by creating a new class with the same name. For
488
496
  instance, if you want to wrap date/time/datetime in a div, you can do:
@@ -4,12 +4,12 @@ module SimpleForm
4
4
  desc "Copy SimpleForm default files"
5
5
  source_root File.expand_path('../templates', __FILE__)
6
6
  class_option :template_engine, :desc => 'Template engine to be invoked (erb, haml or slim).'
7
- class_option :bootstrap, :type => :boolean, :desc => 'Add the Twitter Bootstrap wrappers to the SimpleForm initializer.'
7
+ class_option :bootstrap, :type => :boolean, :desc => 'Add the Bootstrap wrappers to the SimpleForm initializer.'
8
8
  class_option :foundation, :type => :boolean, :desc => 'Add the Zurb Foundation 3 wrappers to the SimpleForm initializer.'
9
9
 
10
10
  def info_bootstrap
11
11
  return if options.bootstrap? || options.foundation?
12
- puts "SimpleForm 2 supports Twitter Bootstrap and Zurb Foundation 3. If you want "\
12
+ puts "SimpleForm 2 supports Bootstrap and Zurb Foundation 3. If you want "\
13
13
  "a configuration that is compatible with one of these frameworks, then please " \
14
14
  "re-run this generator with --bootstrap or --foundation as an option."
15
15
  end
@@ -1,7 +1,7 @@
1
1
  ===============================================================================
2
2
 
3
3
  Be sure to have a copy of the Bootstrap stylesheet available on your
4
- application, you can get it on http://twitter.github.com/bootstrap.
4
+ application, you can get it on http://getbootstrap.com/2.3.2/.
5
5
 
6
6
  Inside your views, use the 'simple_form_for' with one of the Bootstrap form
7
7
  classes, '.form-horizontal', '.form-inline', '.form-search' or
@@ -37,8 +37,8 @@ SimpleForm.setup do |config|
37
37
  end
38
38
  end
39
39
 
40
- # Wrappers for forms and inputs using the Twitter Bootstrap toolkit.
41
- # Check the Bootstrap docs (http://twitter.github.com/bootstrap)
40
+ # Wrappers for forms and inputs using the Bootstrap toolkit.
41
+ # Check the Bootstrap docs (http://getbootstrap.com/2.3.2/)
42
42
  # to learn about the different styles for forms and inputs,
43
43
  # buttons and other elements.
44
44
  config.default_wrapper = :bootstrap
@@ -178,7 +178,8 @@ module SimpleForm
178
178
 
179
179
  # Append a hidden field to make sure something will be sent back to the
180
180
  # server if all checkboxes are unchecked.
181
- hidden = @template.hidden_field_tag("#{object_name}[#{attribute}][]", "", :id => nil)
181
+ hidden_name = html_options[:name] || "#{object_name}[#{attribute}][]"
182
+ hidden = @template.hidden_field_tag(hidden_name, "", :id => nil)
182
183
 
183
184
  wrap_rendered_collection(rendered_collection + hidden, options)
184
185
  end
@@ -342,7 +342,7 @@ module SimpleForm
342
342
  def lookup_model_names
343
343
  @lookup_model_names ||= begin
344
344
  child_index = options[:child_index]
345
- names = object_name.to_s.scan(/([a-zA-Z_]+)/).flatten
345
+ names = object_name.to_s.scan(/(?!\d)\w+/).flatten
346
346
  names.delete(child_index) if child_index
347
347
  names.each { |name| name.gsub!('_attributes', '') }
348
348
  names.freeze
@@ -17,6 +17,7 @@ module SimpleForm
17
17
  input
18
18
  elsif nested_boolean_style?
19
19
  html_options = label_html_options.dup
20
+ html_options[:class] ||= []
20
21
  html_options[:class].push(:checkbox)
21
22
 
22
23
  build_hidden_field_for_checkbox +
@@ -34,7 +35,7 @@ module SimpleForm
34
35
  # reuse the method for nested boolean style, but with no unchecked value,
35
36
  # which won't generate the hidden checkbox. This is the default functionality
36
37
  # in Rails > 3.2.1, and is backported in SimpleForm AV helpers.
37
- def build_check_box(unchecked_value = unchecked_value)
38
+ def build_check_box(unchecked_value = unchecked_value())
38
39
  @builder.check_box(attribute_name, input_html_options, checked_value, unchecked_value)
39
40
  end
40
41
 
@@ -33,7 +33,7 @@ module SimpleForm
33
33
  end
34
34
 
35
35
  def has_required?
36
- super && (input_options[:include_blank] || multiple?)
36
+ super && (input_options[:include_blank] || input_options[:prompt] || multiple?)
37
37
  end
38
38
 
39
39
  # Check if :include_blank must be included by default.
@@ -1,3 +1,3 @@
1
1
  module SimpleForm
2
- VERSION = "2.1.2".freeze
2
+ VERSION = "2.1.3".freeze
3
3
  end
@@ -288,6 +288,13 @@ class BuilderTest < ActionView::TestCase
288
288
  assert_select "form input[type=hidden][name='user[tag_ids][]'][value=]", :count => 1
289
289
  end
290
290
 
291
+ test "collection check box generates a hidden field using the given :name in :input_html" do
292
+ collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')]
293
+ with_collection_check_boxes @user, :tag_ids, collection, :id, :name, {}, {:name => "user[other_tag_ids][]"}
294
+
295
+ assert_select "form input[type=hidden][name='user[other_tag_ids][]'][value=]", :count => 1
296
+ end
297
+
291
298
  test "collection check box accepts a collection and generate a serie of checkboxes with labels for label method" do
292
299
  collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')]
293
300
  with_collection_check_boxes @user, :tag_ids, collection, :id, :name
@@ -79,6 +79,26 @@ class FormBuilderTest < ActionView::TestCase
79
79
  end
80
80
  end
81
81
 
82
+ test 'builder allow to use numbers in the model name' do
83
+ user = UserNumber1And2.new({
84
+ :id => 1,
85
+ :name => 'New in SimpleForm!',
86
+ :description => 'Hello!',
87
+ :created_at => Time.now
88
+ })
89
+
90
+ user.tags = [Tag.new(nil, 'Tag1')]
91
+
92
+ with_concat_form_for(user, :url => '/') do |f|
93
+ f.simple_fields_for(:tags) do |tags|
94
+ tags.input :name
95
+ end
96
+ end
97
+
98
+ assert_select 'form .user_number1_and2_tags_name'
99
+ assert_no_select 'form .user_number1_and2_tags_1_name'
100
+ end
101
+
82
102
  # INPUT TYPES
83
103
  test 'builder should generate text fields for string columns' do
84
104
  with_form_for @user, :name
@@ -137,4 +137,16 @@ class BooleanInputTest < ActionView::TestCase
137
137
  end
138
138
  end
139
139
  end
140
+
141
+ test 'input boolean without additional classes should add "checkbox" class to label' do
142
+ swap_wrapper :default, self.custom_wrapper_without_top_level do
143
+ swap SimpleForm, :boolean_style => :nested, :generate_additional_classes_for => [:input] do
144
+ with_input_for @user, :active, :boolean
145
+
146
+ assert_select 'label'
147
+ assert_select 'label.checkbox'
148
+ assert_no_select 'label.boolean'
149
+ end
150
+ end
151
+ end
140
152
  end
@@ -172,6 +172,12 @@ class CollectionSelectInputTest < ActionView::TestCase
172
172
  assert_select 'select[required]'
173
173
  end
174
174
 
175
+ test 'collection input with select type should generate required html attribute only with blank option or prompt' do
176
+ with_input_for @user, :name, :select, :prompt => 'Name...', :collection => ['Jose', 'Carlos']
177
+ assert_select 'select.required'
178
+ assert_select 'select[required]'
179
+ end
180
+
175
181
  test 'collection input with select type should not generate required html attribute without blank option' do
176
182
  with_input_for @user, :name, :select, :include_blank => false, :collection => ['Jose' , 'Carlos']
177
183
  assert_select 'select.required'
@@ -214,3 +214,6 @@ class HashBackedAuthor < Hash
214
214
  'hash backed author'
215
215
  end
216
216
  end
217
+
218
+ class UserNumber1And2 < User
219
+ end
data/test/test_helper.rb CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
4
  require 'test/unit'
5
- require 'mocha/setup'
5
+ require 'mocha'
6
6
 
7
7
  require 'active_model'
8
8
  require 'action_controller'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - José Valim
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-11-25 00:00:00.000000000 Z
13
+ date: 2015-07-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -163,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
163
  version: '0'
164
164
  requirements: []
165
165
  rubyforge_project: simple_form
166
- rubygems_version: 2.2.2
166
+ rubygems_version: 2.2.3
167
167
  signing_key:
168
168
  specification_version: 4
169
169
  summary: Forms made easy!