form_input 0.9.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dfbcfd90b9bfe55f194df93b4e6749d6724dbde3
4
- data.tar.gz: d3508d9c671ba101a1bc8de09ec1e1abb48f1e75
3
+ metadata.gz: 3bf25959262e5eb0029d1185a5c7a9901a43cd16
4
+ data.tar.gz: 678589bac2e0bdcf52ca76568d63ee18cde7e128
5
5
  SHA512:
6
- metadata.gz: 6aa7ef82d5fe66d86348c97f3b124bb3b82a2fef95f640936093438d7b55901db99e20f29fd4af6fa415ea0b0d8bfb23ad67322dd478eb8b3c43cf54a7f158a2
7
- data.tar.gz: df26ef556347ee3c9ac35557c599fa129838eeceb79f686c17825fdbdd02027f3127682a4a8d1aa81fc124355e650b0c6a8dbeed27904f5f15d5433b05c5b40e
6
+ metadata.gz: f2d7d5d8caa65943d9765cf480f706614f7e77ad67766d5dddddb9f66f0f5f33c7d547aa614e648a5c43bf855c512d9764ea00988eafd3769ca5864733b7e281
7
+ data.tar.gz: fec7c3c8f5114861fefd20ed438a000bdab38f0c5bc912dd8a8a2d335e71c899b7ad22066b40598b1bf36ba3c1b0de1aeed87a5e8e528b4105655188db678f17
data/README.md CHANGED
@@ -62,6 +62,9 @@ validating it, and making it available in a model-like structure.
62
62
  The provided template snippets will take care of rendering the form parameters
63
63
  as well as any errors detected back to the user.
64
64
  You just get to use the input and control the flow the way you want.
65
+ In fact, it's not limited to form input only either -
66
+ it can be used with any web request input,
67
+ including that of [AJAX] or [REST] API end points.
65
68
  The gem is completely framework agnostic,
66
69
  comes with full test coverage,
67
70
  and even supports multi-step forms and localization out of the box.
@@ -100,10 +103,10 @@ Sounds cool enough? Then read on.
100
103
  * [Grouped Parameters](#grouped-parameters)
101
104
  * [Chunked Parameters](#chunked-parameters)
102
105
  * [Multi-Step Forms](#multi-step-forms)
103
- * [Defining Multi-Step Forms](#defining-multi-step-forms)
104
- * [Multi-Step Form Functionality](#multi-step-form-functionality)
105
- * [Using Multi-Step Forms](#using-multi-step-forms)
106
- * [Rendering Multi-Step Forms](#rendering-multi-step-forms)
106
+ * [Defining Multi-Step Forms](#defining-multi-step-forms)
107
+ * [Multi-Step Form Functionality](#multi-step-form-functionality)
108
+ * [Using Multi-Step Forms](#using-multi-step-forms)
109
+ * [Rendering Multi-Step Forms](#rendering-multi-step-forms)
107
110
  * [Localization](#localization)
108
111
  * [Error Messages and Inflection](#error-messages-and-inflection)
109
112
  * [Localizing Forms](#localizing-forms)
@@ -112,7 +115,7 @@ Sounds cool enough? Then read on.
112
115
  * [Inflection Filter](#inflection-filter)
113
116
  * [Localizing Form Steps](#localizing-form-steps)
114
117
  * [Supported Locales](#supported-locales)
115
-
118
+ * [Credits](#credits)
116
119
 
117
120
  ## Form Basics
118
121
 
@@ -121,9 +124,16 @@ what's the difference between internal and external representation,
121
124
  how to create form instances and how to deal with errors,
122
125
  and, finally, how to access the form input itself.
123
126
 
127
+ And note that while forms get mentioned a lot,
128
+ it can be all applied to any other web request input just as well.
129
+ Even [AJAX] end points or [REST] API end points
130
+ can describe their input and let it have converted and validated for them
131
+ by the same means,
132
+ which is worth keeping in mind.
133
+
124
134
  ### Defining Parameters
125
135
 
126
- To create a form, simply inherit from `FormInput` and then
136
+ To define a form, simply inherit from `FormInput` and then
127
137
  use the `param` or `param!` methods to define form parameters like this:
128
138
 
129
139
  ``` ruby
@@ -143,12 +153,12 @@ The _name_ is how you will address the parameter in your code,
143
153
  while the optional _title_ is the string which will be displayed to the user by default.
144
154
 
145
155
  The `param!` method works the same way but creates a required parameter.
146
- Such parameters are required to appear in the input and have non-empty value.
156
+ Such parameters are required to appear in the input and to have a non-empty value.
147
157
  Failure to do so will be automatically reported as an error
148
158
  (discussed further in [Errors and Validation](#errors-and-validation)).
149
159
 
150
- Both methods actually take the optional _options_ as their last argument, too.
151
- The _options_ is a hash which is used to control
160
+ Both methods actually take an optional _options_ as their last argument, too.
161
+ The _options_ argument is a hash which is used to control
152
162
  most aspects of the parameter.
153
163
  In fact, using the _title_ argument is just a shortcut identical to
154
164
  setting the parameter option `:title` to the same value.
@@ -164,9 +174,9 @@ Parameters support many more parameter options,
164
174
  and we will discuss each in turn as we go.
165
175
  Comprehensive summary for an avid reader is however available in [Parameter Options](#parameter-options).
166
176
 
167
- The value of each parameter is a string by default (or `nil` if the parameter is not set).
177
+ The value of each parameter is a string by default (or `nil` if the parameter is not set at all).
168
178
  The string size is implicitly limited to 255 characters and bytes by default.
169
- To limit the size explictly, you can use an optional _size_ parameter like this:
179
+ To limit the size explicitly, you can use an optional _size_ parameter like this:
170
180
 
171
181
  ``` ruby
172
182
  param! :title, "Title", 100
@@ -213,7 +223,7 @@ We could do that by simply setting the `:filter` option to `nil`.
213
223
  However, at the same time we want to get rid of the trailing newline character
214
224
  which is often appended by the browser
215
225
  when the user cuts and pastes the password from somewhere.
216
- Not doing this would make the password fail for no apparent reason,
226
+ Not doing this would make the password eventually fail for no apparent reason,
217
227
  resulting in poor user experience.
218
228
  That's why we use `chomp` as the filter above.
219
229
  The filter block is executed in the context of the string value itself,
@@ -237,7 +247,7 @@ and it will be called to obtain the actual value.
237
247
  The block is called in context of the form parameter itself,
238
248
  so it can access any of its methods and its form's methods easily.
239
249
  For example, you can let the form automatically disable some fields
240
- based on available user permissions by defining `is_forbidden?` accordingly:
250
+ based on available user permissions by defining the `is_forbidden?` method accordingly:
241
251
 
242
252
  ``` ruby
243
253
  param :avatar, "Avatar",
@@ -255,7 +265,7 @@ you can factor them out and share them like this:
255
265
  param :comment, "Comment", FEATURED_ARGS, type: :textarea
256
266
  ```
257
267
 
258
- This works since you can actually pass several hashes in place of the _options_ parameter
268
+ This works since you can actually pass several hashes in place of the _options_ argument
259
269
  and they all get merged together from left to right.
260
270
  This allows you to mix various options presets together and then tweak them further as needed.
261
271
 
@@ -270,7 +280,7 @@ The internal representation, as you might have guessed,
270
280
  are the parameter values which you will use in your application.
271
281
  The external representation is how the parameters are present
272
282
  to the browser via HTML forms or URLs
273
- and passed back to the the server.
283
+ and passed back to the server.
274
284
 
275
285
  Normally, both representations are the same.
276
286
  The parameters are named the same way in both cases
@@ -376,6 +386,9 @@ The complete filter for converting numbers to integers should thus look like thi
376
386
  class: Integer
377
387
  ```
378
388
 
389
+ You can even consider using `strip.empty?`
390
+ if you want to allow an all-whitespace input to be consumed silently.
391
+
379
392
  Of course, all that would be a lot of typing for something as common as integer parameters.
380
393
  That's why the `FormInput` class comes with plenty standard filters predefined:
381
394
 
@@ -416,14 +429,15 @@ But you can easily change this by providing your own `:format` filter instead:
416
429
  The provided block will be called in the context of the parameter value itself
417
430
  and its result will be passed to the `to_s` conversion to create the final external value.
418
431
 
419
- But the use of a formatter is more than just mere cosmetics.
432
+ The use of a formatter is more than just mere cosmetics.
420
433
  You will often use the formatter to complement your input filter.
421
- For example, this is one possible way how to map arbitrary external values
434
+ For example, this is one possible way of how to map arbitrary external values
422
435
  to their internal representation and back:
423
436
 
424
437
  ``` ruby
425
438
  SORT_MODES = { id: 'n', views: 'v', age: 'a', likes: 'l' }
426
439
  SORT_MODE_PARAMETERS = SORT_MODES.invert
440
+
427
441
  param :sort_mode, :s,
428
442
  filter: ->{ SORT_MODE_PARAMETERS[ self ] || self },
429
443
  format: ->{ SORT_MODES[ self ] },
@@ -433,7 +447,7 @@ to their internal representation and back:
433
447
  Note that once again the original value is preserved in case of error,
434
448
  so it can be passed back to the user for fixing.
435
449
 
436
- Another example shows how to process credit card expiration field:
450
+ Another example shows how to process a credit card expiration field:
437
451
 
438
452
  ``` ruby
439
453
  EXPIRY_ARGS = {
@@ -488,7 +502,7 @@ So, what's the difference between `:filter` and `:transform`?
488
502
  For scalar values, like normal string or integer parameters, there is none.
489
503
  In that case the `:transform` is just an additional filter,
490
504
  and you are free to use either or both.
491
- But `FormInput` class supports also array and hash parameters,
505
+ But `FormInput` class also supports array and hash parameters,
492
506
  as we will learn in the very next chapter,
493
507
  and that's where it makes the difference.
494
508
  The input filter is used to convert each individual element,
@@ -525,7 +539,7 @@ rather than becoming an empty array.
525
539
 
526
540
  All the parameter options of scalar parameters can be used with array parameters as well.
527
541
  In this case, however, they apply to the individual elements of the array.
528
- The array parameters additionaly support the `:min_count` and `:max_count` options,
542
+ The array parameters additionally support the `:min_count` and `:max_count` options,
529
543
  which restrict the number of elements the array can have.
530
544
  For example, to limit the keywords both in string size and element count, you can do this:
531
545
 
@@ -539,7 +553,7 @@ whereas the input `:transform` is applied to the array as a whole.
539
553
  For example, to get sorted array of integers you can do this:
540
554
 
541
555
  ``` ruby
542
- array :ids, INTEGER_ARGS, transform: ->{ compact.sort }
556
+ array :ids, INTEGER_ARGS, transform: ->{ compact.sort rescue self }
543
557
  ```
544
558
 
545
559
  The `compact` method above takes care of removing any unfilled entries from the array prior sorting.
@@ -571,18 +585,17 @@ which should specify a regular expression
571
585
  which all hash keys must match.
572
586
  This may not be the wisest move, but it's your call.
573
587
  Just make sure you use the `\A` and `\z` anchors rather than `^` and `$`,
574
- so you don't leave yourself open to nasty suprises.
588
+ so you don't leave yourself open to nasty surprises.
575
589
 
576
- While practical use of hash parameters with forms is fairly limited,
577
- so you will most likely only use them with URL based non-form input, if ever,
590
+ While practical use of hash parameters with forms is relatively limited,
578
591
  the array parameters are pretty common.
579
- The examples above could be used for gathering list of input fields into single array,
592
+ The examples above could be used for gathering list of input fields into a single array,
580
593
  which is useful as well,
581
594
  but the most common use of array parameters is for multi-select or multi-checkbox fields.
582
595
 
583
596
  To declare a select parameter, you can set the `:type` to `:select` and
584
597
  use the `:data` option to provide an array of values for the select menu.
585
- The array contains pairs of parameter values to use and the corresonding text to show to the user.
598
+ The array contains pairs of parameter values to use and the corresponding text to show to the user.
586
599
  For example, using a [Sequel]-like `Country` model:
587
600
 
588
601
  ``` ruby
@@ -999,7 +1012,7 @@ All this ensures you automatically get consistent validation results anytime you
999
1012
  The only exception is when you set the parameter values explicitly using their setter methods.
1000
1013
  This intentionally leaves the errors reported intact,
1001
1014
  allowing you to adjust the parameter values
1002
- without interferring with the validation results.
1015
+ without interfering with the validation results.
1003
1016
  Which finally brings us to the topic of accessing the parameter values themselves.
1004
1017
 
1005
1018
  ### Using Forms
@@ -1168,7 +1181,7 @@ The following methods are available:
1168
1181
  form.incorrect_params # Parameters whose current value doesn't match their kind.
1169
1182
  ```
1170
1183
 
1171
- Each of them simply selects the paramaters using their boolean getter of the same name.
1184
+ Each of them simply selects the parameters using their boolean getter of the same name.
1172
1185
  Each of them is available in the `*_parameters` form for as well,
1173
1186
  for those who don't like the `params` shortcut.
1174
1187
 
@@ -1216,7 +1229,7 @@ What you use this for is up to you.
1216
1229
  We will see later that for example the [Multi-Step Forms](#multi-step-forms) use this for grouping parameters which belong to individual steps,
1217
1230
  but it has plenty other uses as well.
1218
1231
 
1219
- #### URL Helpers
1232
+ ### URL Helpers
1220
1233
 
1221
1234
  The `FormInput` is primarily intended for use with HTML forms,
1222
1235
  which we will discuss in detail in the [Form Templates](#form-templates) chapter,
@@ -1295,7 +1308,7 @@ Finally, if you do not like the idea of parameter arrays in your URLs, you can u
1295
1308
  Just note that none of the standard array parameter validations apply in this case,
1296
1309
  so make sure to apply your own validations using the `:check` callback if you need to.
1297
1310
 
1298
- #### Form Helpers
1311
+ ### Form Helpers
1299
1312
 
1300
1313
  It may come as a surprise, but `FormInput` provides no helpers for creating HTML tags.
1301
1314
  That's because doing so would be a completely futile effort.
@@ -1356,7 +1369,7 @@ To illustrate all this, a select parameter can be rendered like this:
1356
1369
  Finally, you will likely want to render the parameter name in some way.
1357
1370
  For this, each parameter has the `form_title` method,
1358
1371
  which returns the title to show in the form.
1359
- It defaults to its title, but can be overriden with the `:form_title` option.
1372
+ It defaults to its title, but can be overridden with the `:form_title` option.
1360
1373
  If neither is set, the code name will be used instead.
1361
1374
  To render it, you will use something like this:
1362
1375
 
@@ -1385,7 +1398,7 @@ you will eventually want to extend it further to better fit your project.
1385
1398
  To do this, it's common to define the `Form` class inherited from `FormInput`,
1386
1399
  put various helpers there, and base your own forms on that.
1387
1400
  This is also the place where you can include your own `FormInput` types extensions.
1388
- This chapter merely shows some ideas you may want to built upon to get you started.
1401
+ This chapter shows some ideas you may want to built upon to get you started.
1389
1402
 
1390
1403
  Adding custom boolean getters which you may need:
1391
1404
 
@@ -1427,6 +1440,16 @@ Keeping track of additional form state:
1427
1440
  end
1428
1441
  ```
1429
1442
 
1443
+ Adding support for your [own types](https://gist.github.com/raxoft/1e717d7dcaab6949ab03):
1444
+
1445
+ ``` ruby
1446
+ MONEY_ARGS = {
1447
+ filter: ->{ ( Money( self ) rescue self ) unless empty? },
1448
+ format: ->{ Money( self ) },
1449
+ class: Money
1450
+ }
1451
+ ```
1452
+
1430
1453
  The list could go on and on, as everyone might need slightly different tweaks.
1431
1454
  Eventually, though, you will come up with your own set of extensions which you will keep using across projects.
1432
1455
  Once you do, consider sharing them with the rest of the world. Thanks.
@@ -1455,8 +1478,8 @@ This is a brief but comprehensive summary of all parameter options:
1455
1478
  * `:data` - array containing data for parameter types which need one, like select, multi-select, or multi-checkbox.
1456
1479
  Shall contain the allowed parameter values paired with the corresponding text to display in forms.
1457
1480
  Defaults to empty array if not set.
1458
- * `:tag` or `:tags` - arbitrary symbol or array of symbols used to tag the parameter with arbitrary semtantics.
1459
- See `tagged?` method in the [Using Forms](#using-forms) chapter.
1481
+ * `:tag` or `:tags` - arbitrary symbol or array of symbols used to tag the parameter with arbitrary semantics.
1482
+ See the `tagged?` method in the [Using Forms](#using-forms) chapter.
1460
1483
  * `:filter` - callback used to cleanup or convert the input values.
1461
1484
  See [Input Filter](#input-filter).
1462
1485
  * `:transform` - optional callback used to further convert the input values.
@@ -1483,7 +1506,7 @@ This is a brief but comprehensive summary of all parameter options:
1483
1506
  Defaults to 255.
1484
1507
  * `:min_bytesize` - when set, value(s) of that parameter must have at least this many bytes.
1485
1508
  * `:max_bytesize` - when set, value(s) of that parameter may have at most this many bytes.
1486
- Defaults to 255 if `:max_size` is dynamic option or less than 256.
1509
+ Defaults to 255 if `:max_size` is a dynamic option or less than 256.
1487
1510
  * `:reject` - regular expression (or array thereof) which the parameter value(s) may not match.
1488
1511
  * `:reject_msg` - custom error message used when the `:reject` check fails.
1489
1512
  Defaults to `:msg` message.
@@ -1501,11 +1524,11 @@ This is a brief but comprehensive summary of all parameter options:
1501
1524
  * `:gender` - grammatical gender used for localization.
1502
1525
  See [Localization](#localization) for details.
1503
1526
  * `:row` - used for grouping several parameters together, usually to render them in a single row.
1504
- See [Chunked parameters](#chunked-parameters) chapter.
1527
+ See [Chunked Parameters](#chunked-parameters).
1505
1528
  * `:cols` - optional custom option used to set span of the parameter in a single row.
1506
- See [Chunked parameters](#chunked-parameters).
1529
+ See [Chunked Parameters](#chunked-parameters).
1507
1530
  * `:group` - custom option used for grouping parameters in arbitrary ways.
1508
- See [Grouped parameters](#grouped-parameters).
1531
+ See [Grouped Parameters](#grouped-parameters).
1509
1532
  * `:size` - custom option used to set size of `:select` and `:textarea` parameters.
1510
1533
  * `:subtitle` - custom option used to render an additional subtitle after the form title.
1511
1534
  * `:placeholder` - custom option used for setting the placeholder attribute of the parameter.
@@ -1556,7 +1579,7 @@ Also note that you can find the example templates discussed here in the `form_in
1556
1579
  ### Form Template
1557
1580
 
1558
1581
  To put the form on a page, you use the stock HTML `form` tag.
1559
- The snippets will be used for rendering the form content,
1582
+ The snippets will be used for rendering of the form content,
1560
1583
  but the form itself and the submission buttons used are usually form specific anyway,
1561
1584
  so it is rarely worth factoring it out.
1562
1585
  Assuming the controller passes the form to the view in the `@form` variable,
@@ -1704,7 +1727,7 @@ You may want to review it after you have seen them used in some context:
1704
1727
 
1705
1728
  Having seen the basics, we are now ready to start expanding them towards more complex snippets.
1706
1729
 
1707
- ### Complex parameters
1730
+ ### Complex Parameters
1708
1731
 
1709
1732
  Forms are often more than just few simple text input fields,
1710
1733
  so it is necessary to render more complex parameters as well.
@@ -1784,7 +1807,7 @@ we use normal select for scalar parameters and multi-select for array parameters
1784
1807
  The data to render comes from the `data` attribute of the parameter,
1785
1808
  see the [Array and Hash Parameters](#array-and-hash-parameters) chapter for details.
1786
1809
  Also note how the value is passed to the `selected?` method
1787
- and how it is formated by the `format_value` method.
1810
+ and how it is formatted by the `format_value` method.
1788
1811
 
1789
1812
  #### Radio Buttons
1790
1813
 
@@ -1816,10 +1839,10 @@ The `selected?` and `format_value` methods are used the same way, too.
1816
1839
 
1817
1840
  Checkboxes can be used in two ways.
1818
1841
  You can either use them as individual on/off checkboxes,
1819
- or use them as an alternative to multiselect.
1842
+ or use them as an alternative to multi-select.
1820
1843
  Their rendering follows this -
1821
1844
  we use the on/off approach for scalar parameters,
1822
- and the multiselect one for array parameters:
1845
+ and the multi-select one for array parameters:
1823
1846
 
1824
1847
  ``` slim
1825
1848
  - when :checkbox
@@ -1851,7 +1874,7 @@ and the multiselect one for array parameters:
1851
1874
  = p[:text]
1852
1875
  ```
1853
1876
 
1854
- As you can see, the multiselect case is basically identical to rendering of radio buttons,
1877
+ As you can see, the multi-select case is basically identical to rendering of radio buttons,
1855
1878
  only the input type attribute changes.
1856
1879
  For on/off checkboxes, though, there are more changes.
1857
1880
 
@@ -1868,7 +1891,7 @@ like any other parameter option it can be evaluated at runtime if needed,
1868
1891
  see [Defining Parameters](#defining-parameters) for details.
1869
1892
  And the [Localization](#localization) chapter will explain how to get the text localized easily.
1870
1893
 
1871
- ### Inflatable parameters
1894
+ ### Inflatable Parameters
1872
1895
 
1873
1896
  We have seen how to render array parameters as multi-select or multi-checkbox fields.
1874
1897
  Sometimes, however, you really want to render them as an array of text input fields.
@@ -1908,9 +1931,9 @@ which will just update the form,
1908
1931
  in addition to the standard submit button.
1909
1932
  This button will allow the user to add as many items as needed before submitting the form.
1910
1933
 
1911
- ### Extending parameters
1934
+ ### Extending Parameters
1912
1935
 
1913
- The examples above show rendering of parameters which shall take care of most your needs,
1936
+ The examples above show rendering of parameters which shall take care of most of your needs,
1914
1937
  but it doesn't need to end there. Do you need some extra functionality?
1915
1938
  It's trivial to pass additional parameter options along and
1916
1939
  render them in the template the way you need.
@@ -1960,7 +1983,7 @@ You can put them in a hash and add them using a splat operator like this:
1960
1983
  And so on and on.
1961
1984
  As you can see, the templates make it really easy to adjust them any way you may need.
1962
1985
 
1963
- ### Grouped parameters
1986
+ ### Grouped Parameters
1964
1987
 
1965
1988
  Sometimes you may want to group some parameters together and render the groups accordingly,
1966
1989
  say in their own subframe.
@@ -1985,7 +2008,7 @@ The example above uses the `group_name` method which is supposed to return the n
1985
2008
  You would have to provide that,
1986
2009
  but check out the [Localization Helpers](#localization-helpers) chapter for a tip how it can be done easily.
1987
2010
 
1988
- ### Chunked parameters
2011
+ ### Chunked Parameters
1989
2012
 
1990
2013
  Occasionally,
1991
2014
  you may want to render some input fields on the same line.
@@ -2112,7 +2135,7 @@ class PostForm < FormInput
2112
2135
  param :zip, "ZIP Code", tag: :address
2113
2136
 
2114
2137
  param! :message, "Your Message", tag: :message
2115
- param :comment, "Optional Commment", tag: :message
2138
+ param :comment, "Optional Comment", tag: :message
2116
2139
 
2117
2140
  param :url, type: :hidden
2118
2141
  end
@@ -2127,7 +2150,7 @@ the user starts at the first step and finishes at the last
2127
2150
  (at least that's the most typical flow).
2128
2151
 
2129
2152
  The `:tag` option is then used to assign each parameter to particular step.
2130
- If you would need additional tags, remember that you can use the `:tags` array as well.
2153
+ If you would need additional tags, remember that you can use the `:tags` array instead as well.
2131
2154
  Also note that the hidden parameter doesn't have to belong to any step,
2132
2155
  as it will be always rendered as a hidden field anyway.
2133
2156
 
@@ -2141,7 +2164,7 @@ Similarly, you could have an initial `:intro` step or some other intermediate st
2141
2164
  The final `:post` step serves as a terminator which we will use to actually process the form data.
2142
2165
  Note that it doesn't have a name,
2143
2166
  so it won't appear among the list of step names if we decide to display them somewhere
2144
- (see [Rendering Multi-Step Form](#rendering-multi-step-form) for example of that).
2167
+ (see [Rendering Multi-Step Forms](#rendering-multi-step-forms) for example of that).
2145
2168
 
2146
2169
  We will soon delve into how to use such forms, but first let's discuss their enhanced functionality.
2147
2170
 
@@ -2155,12 +2178,12 @@ The most important of those parameters is the `step` parameter.
2155
2178
  It is always set to the name of the current step,
2156
2179
  starting with the first step defined by default.
2157
2180
  If you need to, you can change the current step by simply assigning to it,
2158
- we will see examples of that later in the [Using Multi-Step Form](#using-multi-step-form) chapter.
2181
+ we will see examples of that later in the [Using Multi-Step Forms](#using-multi-step-forms) chapter.
2159
2182
 
2160
2183
  The second important parameter is the `next` parameter.
2161
2184
  It contains the desired step which the user wants to go to whenever he posts the form.
2162
2185
  This parameter is used to let the user progress throughout the form -
2163
- we will see examples of that in the [Rendering Multi-Step Form](#rendering-multi-step-form) chapter.
2186
+ we will see examples of that in the [Rendering Multi-Step Forms](#rendering-multi-step-forms) chapter.
2164
2187
  If it is set and there are no problems with the parameters of the currently submitted step,
2165
2188
  it will be used to update the value of the `step` parameter,
2166
2189
  effectively changing the current step to whatever the user wanted.
@@ -2172,8 +2195,8 @@ The `seen` parameter contains the highest step among the steps seen by the user
2172
2195
  Unlike the `last` parameter, which is always set, the `seen` parameter can be `nil` if no steps were displayed before yet.
2173
2196
  The current step is not included when it is displayed for the first time,
2174
2197
  it will become included only if it is displayed more than once.
2175
- Neither of these parameters is used directly
2176
- They are used by several helper methods for classifying the already visited steps,
2198
+ Neither of these parameters is usually used directly, though.
2199
+ Instead, they are used by several helper methods for classifying the already visited steps,
2177
2200
  which we will see shortly.
2178
2201
 
2179
2202
  There are three methods added which extend the list of methods
@@ -2298,7 +2321,7 @@ from all these methods (except the `extra_steps` method itself, of course):
2298
2321
  ```
2299
2322
 
2300
2323
  The first of the incorrect steps is of particular interest,
2301
- so there is the shortcut method `incorrect_step` just for that:
2324
+ so there is a shortcut method `incorrect_step` just for that:
2302
2325
 
2303
2326
  ``` ruby
2304
2327
  form.incorrect_step # :email
@@ -2464,7 +2487,7 @@ See how the submit button uses the `next` value to proceed to the next step.
2464
2487
  Without it, the form would be merely updated when submitted.
2465
2488
 
2466
2489
  Also note how we control when to display the errors -
2467
- we use the `finished_step?` method to supress the errors whenever
2490
+ we use the `finished_step?` method to suppress the errors whenever
2468
2491
  the user sees certain step for the first time.
2469
2492
 
2470
2493
  Note that it is also possible to divert the form rendering for individual steps if you need to.
@@ -2512,7 +2535,7 @@ To allow users to go back to the previous step, prepend something like this:
2512
2535
  ```
2513
2536
 
2514
2537
  Note that browsers nowadays automatically use the first submit button when the user hits the enter in the text field.
2515
- If you have multiple buttons in the form and the first one is not guarnateed to be the one you want,
2538
+ If you have multiple buttons in the form and the first one is not guaranteed to be the one you want,
2516
2539
  you can add the following invisible button as the first button in the form to make the browser go to the step you want:
2517
2540
 
2518
2541
  ``` slim
@@ -2654,7 +2677,7 @@ the [Inflection Filter](#inflection-filter) chapter will explain the gory detail
2654
2677
  For English, the inflection rules are pretty simple.
2655
2678
  You only need to distinguish between singular and plural grammatical number.
2656
2679
  By default,
2657
- `FormInput` uses plural for scalar parameters and singular for array and hash parameters.
2680
+ `FormInput` uses singular for scalar parameters and plural for array and hash parameters.
2658
2681
  With localization enabled,
2659
2682
  you can override it by setting the `:plural` parameter option to `true` or `'p'` for plural,
2660
2683
  and to `false` or `'s'` for singular, respectively:
@@ -2840,7 +2863,7 @@ forms:
2840
2863
  Note the use of the `:gender` option to get properly inflected error messages.
2841
2864
 
2842
2865
  Now let's say we decide to use a custom error message when the user forgets to fill in the content of the message field.
2843
- To do this, we add the value of the `:required_msg` option of the `message` parameter directly to `en.yml` like this:
2866
+ To do this, we add the value of the `:required_msg` option of the `message` parameter directly to the `en.yml` file like this:
2844
2867
 
2845
2868
  ``` yaml
2846
2869
  message:
@@ -2849,7 +2872,7 @@ To do this, we add the value of the `:required_msg` option of the `message` para
2849
2872
  ```
2850
2873
 
2851
2874
  Note that this works even if you don't add the `:required_msg` option to the parameter
2852
- within the `ContactForm` definition itself.
2875
+ within the `ContactForm` class definition itself.
2853
2876
  That's because as long as you have the locale support enabled,
2854
2877
  all applicable parameter options are automatically looked up in the translation files first.
2855
2878
  If the corresponding translation is found,
@@ -2864,7 +2887,7 @@ However note that R18n normally provides its own default translation based on it
2864
2887
  usually falling back to English in the end.
2865
2888
  This means that once you add some translation to the `en.yml` file,
2866
2889
  the parameter option will get this English translation for all other locales as well,
2867
- until you add the corresponding translation it to the other translations files as well.
2890
+ until you add the corresponding translation to the other translations files as well.
2868
2891
 
2869
2892
  So, to make sure we get the Czech version of the `:required_msg` for the example above,
2870
2893
  the `cs.yml` file should be updated as well like this:
@@ -2953,7 +2976,7 @@ rather than the global namespace.
2953
2976
  ```
2954
2977
 
2955
2978
  Like the `ft` method, it provides three syntax alternatives for getting the desired translation.
2956
- It's worth mentioning that the `()` syntax automatically appends the parameter itself as the last arguments,
2979
+ It's worth mentioning that the `()` syntax automatically appends the parameter itself as the last argument,
2957
2980
  making it available for the [Inflection Filter](#inflection-filter), which will be discussed later.
2958
2981
 
2959
2982
  The `pt` method is typically used in parameter callbacks and
@@ -3005,7 +3028,7 @@ like this:
3005
3028
 
3006
3029
  In either case,
3007
3030
  if set correctly,
3008
- the inflection filter will pick up the last argument provided and choose the appropriatelly inflected message.
3031
+ the inflection filter will pick up the last argument provided and choose the appropriately inflected message.
3009
3032
  Now let's see how exactly is this done.
3010
3033
 
3011
3034
  ### Inflection Filter
@@ -3035,7 +3058,7 @@ used to choose the desired translation.
3035
3058
  Now what is this inflection string and where does it come from?
3036
3059
 
3037
3060
  Each parameter has the `inflection` method which returns
3038
- the desired string used to choose the appropriatelly inflected error message.
3061
+ the desired string used to choose the appropriately inflected error message.
3039
3062
  By default, it returns the grammatical number and grammatical gender strings combined,
3040
3063
  as returned by the `plural` and `gender` methods of the parameter, respectively.
3041
3064
  If needed, it can be also set directly by the `:inflect` parameter option.
@@ -3070,7 +3093,7 @@ Here is an excerpt from the Czech translation file which demonstrates this:
3070
3093
  ```
3071
3094
 
3072
3095
  As you can see, there are three distinct variants in the singular case, one for each gender.
3073
- The plural case on the other hand used the same variant for most genders, with only two specific exceptions defined.
3096
+ The plural case on the other hand uses the same variant for most genders, with only two specific exceptions defined.
3074
3097
 
3075
3098
  Defining translations like this may seem complex,
3076
3099
  but it should feel fairly natural to people fluent in given language.
@@ -3107,7 +3130,7 @@ would look like:
3107
3130
  message:
3108
3131
  title: Your Message
3109
3132
  comment:
3110
- title: Optional Commment
3133
+ title: Optional Comment
3111
3134
  steps:
3112
3135
  email: Email
3113
3136
  name: Name
@@ -3151,6 +3174,8 @@ The `FormInput` is released under the MIT license.
3151
3174
 
3152
3175
 
3153
3176
  [DSL]: http://en.wikipedia.org/wiki/Domain-specific_language
3177
+ [REST]: https://en.wikipedia.org/wiki/Representational_state_transfer
3178
+ [AJAX]: https://en.wikipedia.org/wiki/Ajax_(programming)
3154
3179
  [Sinatra]: http://www.sinatrarb.com/
3155
3180
  [Ramaze]: http://ramaze.net/
3156
3181
  [Slim]: https://github.com/slim-template/slim