button_to_form 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/Changelog.md +13 -0
- data/Readme.md +60 -13
- data/app/helpers/button_to_form_helper.rb +15 -9
- data/config.ru +1 -5
- data/config/rails_environment.rb +11 -0
- data/lib/button_to_form/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc4b4ecc124a1394c6a8f02525a0d88790f83f032393818ff15a4f9488adb7ad
|
4
|
+
data.tar.gz: cb7fca9a94e3285e539c4c35df78e1919dce9e6cc54be85129fc6bbf7c5c7cd5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1bb3ed8a7d0dda063f6871d1ef36dcea0e00c1922b8be3cf83f09eb857f3954c8cc82e2653f3fb31fa0534d5f9b6c0a6c82a2cdecac12b8fce23175ea6fba379
|
7
|
+
data.tar.gz: adbbf8e3c6f2ff3031d40528d5353023937863d74e3c26c15ffe756782a5db85acb38bbf14f24adc613d52761ab3be827ad4d7b4366fb36493848ddb9c9f155f
|
data/Changelog.md
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and the
|
4
|
+
recommendations of [keepachangelog.com](http://keepachangelog.com/).
|
5
|
+
|
6
|
+
## 0.2.0 (2019-12-12)
|
7
|
+
|
8
|
+
- Make `button_options` optional
|
9
|
+
- Don't output another (duplicate) `form` with same id if called again with the same form id
|
10
|
+
|
11
|
+
## 0.1.0 (2019-12-11)
|
12
|
+
|
13
|
+
Initial release
|
data/Readme.md
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
# `button_to_form`
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/button_to_form)
|
4
|
+
[](https://rdoc.info/github/TylerRick/button_to_form/master)
|
4
5
|
|
5
6
|
## Motivation
|
6
7
|
|
7
8
|
The [button_to](https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to)
|
8
|
-
provided by rails
|
9
|
-
HTML doesn't allow a form within
|
9
|
+
provided by rails _doesn't work_ when used inside of a `<form>` tag, because it adds a new `<form>`
|
10
|
+
(at your current nesting level) and HTML doesn't allow a `form` to be nested within another `form`.
|
10
11
|
|
11
12
|
## How does it work?
|
12
13
|
|
13
|
-
The HTML spec
|
14
|
+
The HTML spec _does_, however, allow a button/input/etc. to be
|
14
15
|
associated with a different form than the one it is nested within.
|
15
16
|
|
16
17
|
The [HTML spec says](https://html.spec.whatwg.org/#association-of-controls-and-forms):
|
@@ -19,9 +20,39 @@ The [HTML spec says](https://html.spec.whatwg.org/#association-of-controls-and-f
|
|
19
20
|
> (as described below), but, if it is listed, may have a form attribute specified to override
|
20
21
|
> this.
|
21
22
|
|
22
|
-
This helper takes advantage of that, rendering a separate, empty form in the footer, and then
|
23
|
-
associating this button with it, so that it submits
|
24
|
-
action of the form it is a descendant of.
|
23
|
+
This helper takes advantage of that, rendering a separate, empty `<form>` in the footer, and then
|
24
|
+
associating this `button` with it, so that it submits to *that* `form`'s action _rather_ than to the
|
25
|
+
action of the `form` it is a descendant of.
|
26
|
+
|
27
|
+
So — assuming you have added `<%= content_for(:footer) %>` somewhere in your layout — this source:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
= form_tag '/main_form' do
|
31
|
+
= hidden_field_tag :main_form_param_1, 'main_form'
|
32
|
+
= text_field_tag :main_form_param_2, ''
|
33
|
+
|
34
|
+
= button_to_form 'Make happy', '/make_happy' do
|
35
|
+
= hidden_field_tag :how_happy, 'ecstatic!'
|
36
|
+
```
|
37
|
+
|
38
|
+
will get rendered to HTML that looks something like this:
|
39
|
+
```html
|
40
|
+
<form action="/main_form" accept-charset="UTF-8" method="post">
|
41
|
+
<input type="hidden" name="main_form_param_1" id="main_form_param_1" value="main_form">
|
42
|
+
<input type="text" name="main_form_param_2" id="main_form_param_2" value="">
|
43
|
+
<button name="button" type="submit" form="form-1e7dc01b-46d0-4a44-908e-77fbe2a7ec98">Make happy</button>
|
44
|
+
</form>
|
45
|
+
…
|
46
|
+
<div id="footer">
|
47
|
+
<form id="form-1e7dc01b-46d0-4a44-908e-77fbe2a7ec98" action="/make_happy" accept-charset="UTF-8" method="post">
|
48
|
+
<input type="hidden" name="how_happy" id="how_happy" value="ecstatic!">
|
49
|
+
</form>
|
50
|
+
</div>
|
51
|
+
```
|
52
|
+
|
53
|
+
As you can see, there are 2 `<form>` tags that get rendered, but neither of them is nested within
|
54
|
+
the other, so it is allowed — and works well! Now you can include `button_to` calls inside of
|
55
|
+
other forms as much as your heart desires.
|
25
56
|
|
26
57
|
|
27
58
|
## Installation
|
@@ -37,37 +68,53 @@ For this helper to work, you *must* also include this somewhere in your layout:
|
|
37
68
|
<%= content_for(:footer) %>
|
38
69
|
```
|
39
70
|
|
71
|
+
If you want these forms to be added to a different `content_for` key, say `:forms`, you can
|
72
|
+
configure it like so:
|
73
|
+
```ruby
|
40
74
|
ButtonToFormHelper.content_for_name = :forms
|
75
|
+
```
|
41
76
|
|
42
77
|
## Usage
|
43
78
|
|
44
79
|
By default, it will generate a unique id for the form. In its simplest form, it can be used as a
|
45
80
|
drop-in replacement for Rails's `button_to`. Example:
|
46
81
|
|
82
|
+
```ruby
|
47
83
|
= button_to_form 'Make happy', [:make_happy, user]
|
84
|
+
```
|
85
|
+
(These examples use HAML, but you could just as easily use ERB.)
|
86
|
+
|
87
|
+
Unless you have a use case where the default generated id doesn't work, it is recommended to use
|
88
|
+
that approach, as it ensures that each `button_to_form` call has its own corresponding unique
|
89
|
+
`<form>`.
|
48
90
|
|
49
|
-
If you need to reference this form in other places, you
|
50
|
-
also pass other `form_options`, such as `method`.
|
91
|
+
If, however, you need to reference this form in other places, you can specify a well-known id as the
|
92
|
+
form's id. You can also pass other `form_options`, such as `method`.
|
51
93
|
|
94
|
+
```ruby
|
52
95
|
= button_to_form 'Delete', thing,
|
53
96
|
{data: {confirm: 'Are you sure?'}},
|
54
97
|
{method: 'delete', id: 'delete_thing_form'}
|
55
98
|
= hidden_field_tag :some_id, some_id, {form: 'delete_thing_form'}
|
99
|
+
```
|
56
100
|
|
57
|
-
You may pass along additional data to the endpoint via
|
58
|
-
block. You don't need to specify the form in this case because, as descendants, they are already
|
59
|
-
associated with this form.
|
101
|
+
You may pass along additional data to the endpoint via `hidden_field_tag`s by passing them inside a
|
102
|
+
block. You don't need to specify the `form` in this case because, as descendants, they are already
|
103
|
+
associated with this new form.
|
60
104
|
|
105
|
+
```ruby
|
61
106
|
= button_to_form 'Delete', thing,
|
62
107
|
{data: {confirm: 'Are you sure?'}},
|
63
|
-
{method: 'delete'}
|
108
|
+
{method: 'delete'} do
|
64
109
|
= hidden_field_tag :some_id, some_id
|
65
|
-
|
110
|
+
```
|
66
111
|
|
67
112
|
## Development
|
68
113
|
|
69
114
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
70
115
|
|
116
|
+
To start up a development web server with the same internal Rails app that is used for tests, run `rackup`.
|
117
|
+
|
71
118
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
72
119
|
|
73
120
|
## Contributing
|
@@ -41,19 +41,25 @@ module ButtonToFormHelper
|
|
41
41
|
# {method: 'delete'}
|
42
42
|
# = hidden_field_tag :some_id, some_id
|
43
43
|
#
|
44
|
-
|
44
|
+
# If you call button_to_form with the same form id, it will render the button but will _not_
|
45
|
+
# render another form with the same id since it doesn't make sense to have multiple forms with the
|
46
|
+
# same id. Instead it will assume you want another form that reuses (gets associated with) the
|
47
|
+
# *existing* form with that id.
|
48
|
+
#
|
49
|
+
def button_to_form(button_text, url, button_options = {}, form_options = {}, &block)
|
45
50
|
form_options[:id] ||= "form-#{SecureRandom.uuid}"
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
+
@button_to_form_ids ||= []
|
52
|
+
@button_to_form_id = form_options[:id]
|
53
|
+
unless @button_to_form_ids.include?(@button_to_form_id)
|
54
|
+
content_for(ButtonToFormHelper.content_for_name) do
|
55
|
+
form_tag(url, **form_options) do
|
56
|
+
block.call if block
|
57
|
+
end
|
51
58
|
end
|
52
59
|
end
|
53
|
-
|
54
|
-
# controller.instance_variable_set '@button_to_form_needs_to_render_content_for_name', true
|
60
|
+
@button_to_form_ids << @button_to_form_id
|
55
61
|
|
56
|
-
button_tag(button_text, **button_options, type: 'submit', form:
|
62
|
+
button_tag(button_text, **button_options, type: 'submit', form: @button_to_form_id)
|
57
63
|
end
|
58
64
|
|
59
65
|
end
|
data/config.ru
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
# This common code has been extracted to ensure that both config.ru and spec/spec_helper.rb
|
2
|
+
# configure Combustion/Rails in exactly the same way.
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
require "bundler"
|
6
|
+
|
7
|
+
Bundler.require :default, :development
|
8
|
+
|
9
|
+
Combustion.initialize! :action_controller, :action_view
|
10
|
+
|
11
|
+
ButtonToFormHelper.content_for_name = :forms
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: button_to_form
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Rick
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- bin/setup
|
60
60
|
- button_to_form.gemspec
|
61
61
|
- config.ru
|
62
|
+
- config/rails_environment.rb
|
62
63
|
- lib/button_to_form.rb
|
63
64
|
- lib/button_to_form/engine.rb
|
64
65
|
- lib/button_to_form/version.rb
|