actionview 7.0.4 → 7.1.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +343 -232
- data/MIT-LICENSE +1 -1
- data/README.rdoc +3 -3
- data/app/assets/javascripts/rails-ujs.esm.js +686 -0
- data/app/assets/javascripts/rails-ujs.js +630 -0
- data/lib/action_view/base.rb +34 -14
- data/lib/action_view/buffers.rb +106 -8
- data/lib/action_view/cache_expiry.rb +40 -43
- data/lib/action_view/context.rb +1 -1
- data/lib/action_view/deprecator.rb +7 -0
- data/lib/action_view/digestor.rb +1 -1
- data/lib/action_view/gem_version.rb +4 -4
- data/lib/action_view/helpers/active_model_helper.rb +1 -1
- data/lib/action_view/helpers/asset_tag_helper.rb +136 -52
- data/lib/action_view/helpers/asset_url_helper.rb +6 -5
- data/lib/action_view/helpers/atom_feed_helper.rb +5 -5
- data/lib/action_view/helpers/cache_helper.rb +7 -13
- data/lib/action_view/helpers/capture_helper.rb +32 -12
- data/lib/action_view/helpers/content_exfiltration_prevention_helper.rb +70 -0
- data/lib/action_view/helpers/controller_helper.rb +6 -0
- data/lib/action_view/helpers/csp_helper.rb +2 -2
- data/lib/action_view/helpers/csrf_helper.rb +3 -3
- data/lib/action_view/helpers/date_helper.rb +67 -59
- data/lib/action_view/helpers/debug_helper.rb +3 -3
- data/lib/action_view/helpers/form_helper.rb +56 -26
- data/lib/action_view/helpers/form_options_helper.rb +4 -1
- data/lib/action_view/helpers/form_tag_helper.rb +49 -15
- data/lib/action_view/helpers/javascript_helper.rb +1 -0
- data/lib/action_view/helpers/number_helper.rb +37 -329
- data/lib/action_view/helpers/output_safety_helper.rb +4 -4
- data/lib/action_view/helpers/rendering_helper.rb +1 -1
- data/lib/action_view/helpers/sanitize_helper.rb +51 -21
- data/lib/action_view/helpers/tag_helper.rb +5 -27
- data/lib/action_view/helpers/tags/base.rb +11 -52
- data/lib/action_view/helpers/tags/collection_check_boxes.rb +1 -0
- data/lib/action_view/helpers/tags/collection_radio_buttons.rb +1 -0
- data/lib/action_view/helpers/tags/collection_select.rb +3 -0
- data/lib/action_view/helpers/tags/date_field.rb +1 -1
- data/lib/action_view/helpers/tags/date_select.rb +2 -0
- data/lib/action_view/helpers/tags/datetime_field.rb +14 -6
- data/lib/action_view/helpers/tags/datetime_local_field.rb +11 -2
- data/lib/action_view/helpers/tags/grouped_collection_select.rb +3 -0
- data/lib/action_view/helpers/tags/month_field.rb +1 -1
- data/lib/action_view/helpers/tags/select.rb +4 -1
- data/lib/action_view/helpers/tags/select_renderer.rb +56 -0
- data/lib/action_view/helpers/tags/time_field.rb +1 -1
- data/lib/action_view/helpers/tags/time_zone_select.rb +3 -0
- data/lib/action_view/helpers/tags/week_field.rb +1 -1
- data/lib/action_view/helpers/tags/weekday_select.rb +3 -0
- data/lib/action_view/helpers/tags.rb +2 -0
- data/lib/action_view/helpers/text_helper.rb +156 -84
- data/lib/action_view/helpers/translation_helper.rb +3 -3
- data/lib/action_view/helpers/url_helper.rb +47 -18
- data/lib/action_view/helpers.rb +2 -0
- data/lib/action_view/layouts.rb +8 -6
- data/lib/action_view/log_subscriber.rb +49 -32
- data/lib/action_view/lookup_context.rb +29 -13
- data/lib/action_view/path_registry.rb +57 -0
- data/lib/action_view/path_set.rb +13 -14
- data/lib/action_view/railtie.rb +26 -3
- data/lib/action_view/record_identifier.rb +15 -8
- data/lib/action_view/renderer/abstract_renderer.rb +1 -1
- data/lib/action_view/renderer/collection_renderer.rb +10 -2
- data/lib/action_view/renderer/partial_renderer/collection_caching.rb +21 -3
- data/lib/action_view/renderer/partial_renderer.rb +2 -1
- data/lib/action_view/renderer/renderer.rb +2 -0
- data/lib/action_view/renderer/streaming_template_renderer.rb +3 -2
- data/lib/action_view/renderer/template_renderer.rb +3 -2
- data/lib/action_view/rendering.rb +22 -4
- data/lib/action_view/ripper_ast_parser.rb +6 -6
- data/lib/action_view/routing_url_for.rb +4 -4
- data/lib/action_view/template/error.rb +14 -1
- data/lib/action_view/template/handlers/builder.rb +4 -4
- data/lib/action_view/template/handlers/erb/erubi.rb +23 -27
- data/lib/action_view/template/handlers/erb.rb +73 -1
- data/lib/action_view/template/handlers.rb +1 -1
- data/lib/action_view/template/html.rb +1 -1
- data/lib/action_view/template/raw_file.rb +1 -1
- data/lib/action_view/template/renderable.rb +1 -1
- data/lib/action_view/template/resolver.rb +15 -5
- data/lib/action_view/template/text.rb +1 -1
- data/lib/action_view/template/types.rb +25 -34
- data/lib/action_view/template.rb +249 -54
- data/lib/action_view/template_path.rb +2 -0
- data/lib/action_view/test_case.rb +176 -21
- data/lib/action_view/unbound_template.rb +17 -7
- data/lib/action_view/version.rb +1 -1
- data/lib/action_view/view_paths.rb +15 -24
- data/lib/action_view.rb +4 -1
- metadata +27 -28
- data/lib/assets/compiled/rails-ujs.js +0 -746
data/CHANGELOG.md
CHANGED
@@ -1,405 +1,516 @@
|
|
1
|
-
## Rails 7.
|
1
|
+
## Rails 7.1.5.1 (December 10, 2024) ##
|
2
2
|
|
3
|
-
*
|
4
|
-
`object_name` arguments. For example:
|
3
|
+
* No changes.
|
5
4
|
|
6
|
-
```erb
|
7
|
-
<%= fields do |f| %>
|
8
|
-
<%= f.field_name :body %>
|
9
|
-
<% end %>
|
10
|
-
```
|
11
5
|
|
12
|
-
|
6
|
+
## Rails 7.1.5 (October 30, 2024) ##
|
13
7
|
|
14
|
-
*
|
8
|
+
* No changes.
|
15
9
|
|
16
|
-
Because these strings contain no HTML elements and the basic entities are escaped, they are safe
|
17
|
-
to be included as-is as PCDATA in HTML content. Tagging them as html-safe avoids double-escaping
|
18
|
-
entities when being concatenated to a SafeBuffer during rendering.
|
19
10
|
|
20
|
-
|
11
|
+
## Rails 7.1.4.2 (October 23, 2024) ##
|
21
12
|
|
22
|
-
|
13
|
+
* No changes.
|
23
14
|
|
24
|
-
|
15
|
+
|
16
|
+
## Rails 7.1.4.1 (October 15, 2024) ##
|
25
17
|
|
26
18
|
* No changes.
|
27
19
|
|
28
20
|
|
29
|
-
## Rails 7.
|
21
|
+
## Rails 7.1.4 (August 22, 2024) ##
|
30
22
|
|
31
|
-
*
|
23
|
+
* Action View Test Case `rendered` memoization.
|
32
24
|
|
33
25
|
*Sean Doyle*
|
34
26
|
|
35
|
-
|
27
|
+
* Restore the ability for templates to return any kind of object and not just strings
|
36
28
|
|
37
|
-
*
|
29
|
+
*Jean Boussier*
|
38
30
|
|
39
|
-
|
40
|
-
tag helpers, following the XML specification. Rename the option
|
41
|
-
`:escape_attributes` to `:escape`, to simplify by applying the option to the
|
42
|
-
whole tag.
|
31
|
+
* Fix threading issue with strict locals.
|
43
32
|
|
44
|
-
|
33
|
+
*Robert Fletcher*
|
45
34
|
|
46
|
-
|
35
|
+
|
36
|
+
## Rails 7.1.3.4 (June 04, 2024) ##
|
47
37
|
|
48
38
|
* No changes.
|
49
39
|
|
50
40
|
|
51
|
-
## Rails 7.
|
41
|
+
## Rails 7.1.3.3 (May 16, 2024) ##
|
52
42
|
|
53
43
|
* No changes.
|
54
44
|
|
55
45
|
|
56
|
-
## Rails 7.
|
46
|
+
## Rails 7.1.3.2 (February 21, 2024) ##
|
57
47
|
|
58
48
|
* No changes.
|
59
49
|
|
60
50
|
|
61
|
-
## Rails 7.
|
51
|
+
## Rails 7.1.3.1 (February 21, 2024) ##
|
62
52
|
|
63
|
-
*
|
53
|
+
* No changes.
|
64
54
|
|
65
|
-
*Máximo Mussini*
|
66
55
|
|
67
|
-
|
68
|
-
a `response` method.
|
56
|
+
## Rails 7.1.3 (January 16, 2024) ##
|
69
57
|
|
70
|
-
|
58
|
+
* Better handle SyntaxError in Action View.
|
71
59
|
|
60
|
+
*Mario Caropreso*
|
72
61
|
|
73
|
-
|
62
|
+
* Fix `word_wrap` with empty string.
|
74
63
|
|
75
|
-
*
|
64
|
+
*Jonathan Hefner*
|
76
65
|
|
77
|
-
|
66
|
+
* Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`.
|
78
67
|
|
79
|
-
|
68
|
+
Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`.
|
80
69
|
|
81
|
-
*
|
70
|
+
*Sean Doyle*
|
82
71
|
|
72
|
+
* Fix detection of required strict locals.
|
83
73
|
|
84
|
-
|
74
|
+
Further fix `render @collection` compatibility with strict locals
|
85
75
|
|
86
|
-
*
|
87
|
-
`ActionView::Helper::FormBuilder#file_field` with `multiple: true` to
|
88
|
-
support submitting an empty collection of files.
|
76
|
+
*Jean Boussier*
|
89
77
|
|
90
|
-
```ruby
|
91
|
-
form.file_field :attachments, multiple: true
|
92
|
-
# => <input type="hidden" autocomplete="off" name="post[attachments][]" value="">
|
93
|
-
<input type="file" multiple="multiple" id="post_attachments" name="post[attachments][]">
|
94
78
|
|
95
|
-
|
96
|
-
# => <input type="file" multiple="multiple" id="post_attachments" name="post[attachments][]">
|
97
|
-
```
|
79
|
+
## Rails 7.1.2 (November 10, 2023) ##
|
98
80
|
|
99
|
-
|
81
|
+
* Fix the `number_to_human_size` view helper to correctly work with negative numbers.
|
100
82
|
|
101
|
-
*
|
83
|
+
*Earlopain*
|
102
84
|
|
103
|
-
|
85
|
+
* Automatically discard the implicit locals injected by collection rendering for template that can't accept them
|
104
86
|
|
87
|
+
When rendering a collection, two implicit variables are injected, which breaks templates with strict locals.
|
105
88
|
|
106
|
-
|
89
|
+
Now they are only passed if the template will actually accept them.
|
107
90
|
|
108
|
-
*
|
91
|
+
*Yasha Krasnou*, *Jean Boussier*
|
109
92
|
|
93
|
+
* Fix `@rails/ujs` calling `start()` an extra time when using bundlers
|
110
94
|
|
111
|
-
|
95
|
+
*Hartley McGuire*, *Ryunosuke Sato*
|
112
96
|
|
113
|
-
*
|
97
|
+
* Fix the `capture` view helper compatibility with HAML and Slim
|
114
98
|
|
115
|
-
|
99
|
+
When a blank string was captured in HAML or Slim (and possibly other template engines)
|
100
|
+
it would instead return the entire buffer.
|
116
101
|
|
117
|
-
*
|
118
|
-
[@nested, @model]`.
|
102
|
+
*Jean Boussier*
|
119
103
|
|
120
|
-
*Sean Doyle*
|
121
104
|
|
122
|
-
|
123
|
-
argument to `button_to` when combined with a block:
|
105
|
+
## Rails 7.1.1 (October 11, 2023) ##
|
124
106
|
|
125
|
-
|
126
|
-
button_to(Workshop.find(1)){ "Update" }
|
127
|
-
#=> <form method="post" action="/workshops/1" class="button_to">
|
128
|
-
#=> <input type="hidden" name="_method" value="patch" autocomplete="off" />
|
129
|
-
#=> <button type="submit">Update</button>
|
130
|
-
#=> </form>
|
107
|
+
* Updated `@rails/ujs` files to ignore certain data-* attributes when element is contenteditable.
|
131
108
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
109
|
+
This fix was already landed in >= 7.0.4.3, < 7.1.0.
|
110
|
+
[[CVE-2023-23913](https://github.com/advisories/GHSA-xp5h-f8jf-rc8q)]
|
111
|
+
|
112
|
+
*Ryunosuke Sato*
|
113
|
+
|
114
|
+
|
115
|
+
## Rails 7.1.0 (October 05, 2023) ##
|
116
|
+
|
117
|
+
* No changes.
|
138
118
|
|
139
|
-
*Sean Doyle*
|
140
119
|
|
141
|
-
|
120
|
+
## Rails 7.1.0.rc2 (October 01, 2023) ##
|
121
|
+
|
122
|
+
* No changes.
|
123
|
+
|
124
|
+
|
125
|
+
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
126
|
+
|
127
|
+
* Introduce `ActionView::TestCase.register_parser`
|
142
128
|
|
143
129
|
```ruby
|
144
|
-
|
145
|
-
|
130
|
+
register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }
|
131
|
+
|
132
|
+
test "renders RSS" do
|
133
|
+
article = Article.create!(title: "Hello, world")
|
146
134
|
|
147
|
-
|
148
|
-
|
135
|
+
render formats: :rss, partial: article
|
136
|
+
|
137
|
+
assert_equal "Hello, world", rendered.rss.items.last.title
|
149
138
|
end
|
150
|
-
# => <button name="post[draft]" value="true" type="submit">
|
151
|
-
# <strong>Save as draft</strong>
|
152
|
-
# </button>
|
153
139
|
```
|
154
140
|
|
141
|
+
By default, register parsers for `:html` and `:json`.
|
142
|
+
|
155
143
|
*Sean Doyle*
|
156
144
|
|
157
|
-
|
158
|
-
|
145
|
+
|
146
|
+
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
147
|
+
|
148
|
+
* Fix `simple_format` with blank `wrapper_tag` option returns plain html tag
|
149
|
+
|
150
|
+
By default `simple_format` method returns the text wrapped with `<p>`. But if we explicitly specify
|
151
|
+
the `wrapper_tag: nil` in the options, it returns the text wrapped with `<></>` tag.
|
152
|
+
|
153
|
+
Before:
|
159
154
|
|
160
155
|
```ruby
|
161
|
-
|
162
|
-
|
163
|
-
# => <input type="text" name="post[tag][]">
|
164
|
-
end
|
156
|
+
simple_format("Hello World", {}, { wrapper_tag: nil })
|
157
|
+
# <>Hello World</>
|
165
158
|
```
|
166
159
|
|
167
|
-
|
168
|
-
|
169
|
-
* Execute the `ActionView::Base.field_error_proc` within the context of the
|
170
|
-
`ActionView::Base` instance:
|
160
|
+
After:
|
171
161
|
|
172
162
|
```ruby
|
173
|
-
|
163
|
+
simple_format("Hello World", {}, { wrapper_tag: nil })
|
164
|
+
# <p>Hello World</p>
|
174
165
|
```
|
175
166
|
|
167
|
+
*Akhil G Krishnan*, *Junichi Ito*
|
168
|
+
|
169
|
+
* Don't double-encode nested `field_id` and `field_name` index values
|
170
|
+
|
171
|
+
Pass `index: @options` as a default keyword argument to `field_id` and
|
172
|
+
`field_name` view helper methods.
|
173
|
+
|
176
174
|
*Sean Doyle*
|
177
175
|
|
178
|
-
*
|
176
|
+
* Allow opting in/out of `Link preload` headers when calling `stylesheet_link_tag` or `javascript_include_tag`
|
179
177
|
|
180
178
|
```ruby
|
181
|
-
|
182
|
-
|
179
|
+
# will exclude header, even if setting is enabled:
|
180
|
+
javascript_include_tag("http://example.com/all.js", preload_links_header: false)
|
183
181
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
button_to "Create", Post.new, authenticity_token: "secret"
|
188
|
-
# => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button><input type="hidden" name="form_token" value="secret" autocomplete="off" /></form>
|
182
|
+
# will include header, even if setting is disabled:
|
183
|
+
stylesheet_link_tag("http://example.com/all.js", preload_links_header: true)
|
189
184
|
```
|
190
185
|
|
191
|
-
*
|
186
|
+
*Alex Ghiculescu*
|
192
187
|
|
193
|
-
*
|
188
|
+
* Stop generating `Link preload` headers once it has reached 1KB.
|
194
189
|
|
195
|
-
|
196
|
-
|
197
|
-
* `form_tag false` or `form_tag ..., action: false`
|
198
|
-
* `button_to "...", false` or `button_to(false) { ... }`
|
190
|
+
Some proxies have trouble handling large headers, but more importantly preload links
|
191
|
+
have diminishing returns so it's preferable not to go overboard with them.
|
199
192
|
|
200
|
-
|
193
|
+
If tighter control is needed, it's recommended to disable automatic generation of preloads
|
194
|
+
and to generate them manually from the controller or from a middleware.
|
201
195
|
|
202
|
-
*
|
196
|
+
*Jean Boussier*
|
203
197
|
|
204
|
-
|
205
|
-
# generates day options like <option value="1">1st</option>\n<option value="2">2nd</option>...
|
198
|
+
* `simple_format` helper now handles a `:sanitize_options` - any extra options you want appending to the sanitize.
|
206
199
|
|
207
|
-
|
200
|
+
Before:
|
201
|
+
```ruby
|
202
|
+
simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>")
|
203
|
+
# => "<p><a href=\"http://example.com\">Continue</a></p>"
|
204
|
+
```
|
208
205
|
|
209
|
-
|
210
|
-
|
206
|
+
After:
|
207
|
+
```ruby
|
208
|
+
simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>", {}, { sanitize_options: { attributes: %w[target href] } })
|
209
|
+
# => "<p><a target=\"_blank\" href=\"http://example.com\">Continue</a></p>"
|
210
|
+
```
|
211
211
|
|
212
|
-
|
213
|
-
#=> <a href="/profiles/1">Eileen</a>
|
212
|
+
*Andrei Andriichuk*
|
214
213
|
|
215
|
-
|
214
|
+
* Add support for HTML5 standards-compliant sanitizers, and default to `Rails::HTML5::Sanitizer`
|
215
|
+
in the Rails 7.1 configuration if it is supported.
|
216
216
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
name
|
221
|
-
end
|
222
|
-
end
|
217
|
+
Action View's HTML sanitizers can be configured by setting
|
218
|
+
`config.action_view.sanitizer_vendor`. Supported values are `Rails::HTML4::Sanitizer` or
|
219
|
+
`Rails::HTML5::Sanitizer`.
|
223
220
|
|
224
|
-
|
225
|
-
|
221
|
+
The Rails 7.1 configuration will set this to `Rails::HTML5::Sanitizer` when it is supported, and
|
222
|
+
fall back to `Rails::HTML4::Sanitizer`. Previous configurations default to
|
223
|
+
`Rails::HTML4::Sanitizer`.
|
226
224
|
|
227
|
-
|
228
|
-
#=> <a href="/profiles/1">Eileen</a>
|
225
|
+
*Mike Dalessio*
|
229
226
|
|
230
|
-
|
227
|
+
* `config.dom_testing_default_html_version` controls the HTML parser used by
|
228
|
+
`ActionView::TestCase#document_root_element`, which creates the DOM used by the assertions in
|
229
|
+
Rails::Dom::Testing.
|
231
230
|
|
232
|
-
|
231
|
+
The Rails 7.1 default configuration opts into the HTML5 parser when it is supported, to better
|
232
|
+
represent what the DOM would be in a browser user agent. Previously this test helper always used
|
233
|
+
Nokogiri's HTML4 parser.
|
233
234
|
|
234
|
-
|
235
|
-
# => <svg><use href="#cool-icon"></svg>
|
235
|
+
*Mike Dalessio*
|
236
236
|
|
237
|
-
|
237
|
+
* Add support for the HTML picture tag. It supports passing a String, an Array or a Block.
|
238
|
+
Supports passing properties directly to the img tag via the `:image` key.
|
239
|
+
Since the picture tag requires an img tag, the last element you provide will be used for the img tag.
|
240
|
+
For complete control over the picture tag, a block can be passed, which will populate the contents of the tag accordingly.
|
238
241
|
|
242
|
+
Can be used like this for a single source:
|
243
|
+
```erb
|
244
|
+
<%= picture_tag("picture.webp") %>
|
245
|
+
```
|
246
|
+
which will generate the following:
|
247
|
+
```html
|
248
|
+
<picture>
|
249
|
+
<img src="/images/picture.webp" />
|
250
|
+
</picture>
|
251
|
+
```
|
239
252
|
|
240
|
-
|
253
|
+
For multiple sources:
|
254
|
+
```erb
|
255
|
+
<%= picture_tag("picture.webp", "picture.png", :class => "mt-2", :image => { alt: "Image", class: "responsive-img" }) %>
|
256
|
+
```
|
257
|
+
will generate:
|
258
|
+
```html
|
259
|
+
<picture class="mt-2">
|
260
|
+
<source srcset="/images/picture.webp" />
|
261
|
+
<source srcset="/images/picture.png" />
|
262
|
+
<img alt="Image" class="responsive-img" src="/images/picture.png" />
|
263
|
+
</picture>
|
264
|
+
```
|
241
265
|
|
242
|
-
|
266
|
+
Full control via a block:
|
267
|
+
```erb
|
268
|
+
<%= picture_tag(:class => "my-class") do %>
|
269
|
+
<%= tag(:source, :srcset => image_path("picture.webp")) %>
|
270
|
+
<%= tag(:source, :srcset => image_path("picture.png")) %>
|
271
|
+
<%= image_tag("picture.png", :alt => "Image") %>
|
272
|
+
<% end %>
|
273
|
+
```
|
274
|
+
will generate:
|
275
|
+
```html
|
276
|
+
<picture class="my-class">
|
277
|
+
<source srcset="/images/picture.webp" />
|
278
|
+
<source srcset="/images/picture.png" />
|
279
|
+
<img alt="Image" src="/images/picture.png" />
|
280
|
+
</picture>
|
281
|
+
```
|
243
282
|
|
283
|
+
*Juan Pablo Balarini*
|
244
284
|
|
245
|
-
|
285
|
+
* Remove deprecated support to passing instance variables as locals to partials.
|
246
286
|
|
247
|
-
*
|
248
|
-
exceptions as flow control.
|
287
|
+
*Rafael Mendonça França*
|
249
288
|
|
250
|
-
|
289
|
+
* Remove deprecated constant `ActionView::Path`.
|
251
290
|
|
252
|
-
*
|
291
|
+
*Rafael Mendonça França*
|
253
292
|
|
254
|
-
|
293
|
+
* Guard `token_list` calls from escaping HTML too often
|
255
294
|
|
256
|
-
*
|
295
|
+
*Sean Doyle*
|
257
296
|
|
258
|
-
|
297
|
+
* `select` can now be called with a single hash containing options and some HTML options
|
259
298
|
|
260
|
-
|
299
|
+
Previously this would not work as expected:
|
261
300
|
|
262
|
-
|
301
|
+
```erb
|
302
|
+
<%= select :post, :author, authors, required: true %>
|
303
|
+
```
|
263
304
|
|
264
|
-
|
305
|
+
Instead you needed to do this:
|
265
306
|
|
266
|
-
|
267
|
-
|
307
|
+
```erb
|
308
|
+
<%= select :post, :author, authors, {}, required: true %>
|
309
|
+
```
|
268
310
|
|
269
|
-
|
311
|
+
Now, either form is accepted, for the following HTML attributes: `required`, `multiple`, `size`.
|
270
312
|
|
271
|
-
|
272
|
-
# => <input value="16:22:01.440" type="time" />
|
313
|
+
*Alex Ghiculescu*
|
273
314
|
|
274
|
-
|
315
|
+
* Datetime form helpers (`time_field`, `date_field`, `datetime_field`, `week_field`, `month_field`) now accept an instance of Time/Date/DateTime as `:value` option.
|
275
316
|
|
276
|
-
|
317
|
+
Before:
|
318
|
+
```erb
|
319
|
+
<%= form.datetime_field :written_at, value: Time.current.strftime("%Y-%m-%dT%T") %>
|
320
|
+
```
|
321
|
+
|
322
|
+
After:
|
323
|
+
```erb
|
324
|
+
<%= form.datetime_field :written_at, value: Time.current %>
|
325
|
+
```
|
277
326
|
|
278
|
-
*
|
327
|
+
*Andrey Samsonov*
|
279
328
|
|
280
|
-
|
329
|
+
* Choices of `select` can optionally contain html attributes as the last element
|
330
|
+
of the child arrays when using grouped/nested collections
|
281
331
|
|
282
|
-
|
332
|
+
```erb
|
333
|
+
<%= form.select :foo, [["North America", [["United States","US"],["Canada","CA"]], { disabled: "disabled" }]] %>
|
334
|
+
# => <select><optgroup label="North America" disabled="disabled"><option value="US">United States</option><option value="CA">Canada</option></optgroup></select>
|
335
|
+
```
|
283
336
|
|
284
|
-
*
|
337
|
+
*Chris Gunther*
|
285
338
|
|
286
|
-
*
|
339
|
+
* `check_box_tag` and `radio_button_tag` now accept `checked` as a keyword argument
|
287
340
|
|
288
|
-
|
341
|
+
This is to make the API more consistent with the `FormHelper` variants. You can now
|
342
|
+
provide `checked` as a positional or keyword argument:
|
289
343
|
|
290
|
-
|
291
|
-
|
344
|
+
```erb
|
345
|
+
= check_box_tag "admin", "1", false
|
346
|
+
= check_box_tag "admin", "1", checked: false
|
292
347
|
|
293
|
-
|
348
|
+
= radio_button_tag 'favorite_color', 'maroon', false
|
349
|
+
= radio_button_tag 'favorite_color', 'maroon', checked: false
|
350
|
+
```
|
294
351
|
|
295
|
-
*
|
296
|
-
`.css` extension appended to the stylesheet path.
|
352
|
+
*Alex Ghiculescu*
|
297
353
|
|
298
|
-
|
354
|
+
* Allow passing a class to `dom_id`.
|
355
|
+
You no longer need to call `new` when passing a class to `dom_id`.
|
356
|
+
This makes `dom_id` behave like `dom_class` in this regard.
|
357
|
+
Apart from saving a few keystrokes, it prevents Ruby from needing
|
358
|
+
to instantiate a whole new object just to generate a string.
|
299
359
|
|
360
|
+
Before:
|
300
361
|
```ruby
|
301
|
-
|
302
|
-
# <link href="/stylesheets/style.less.scss" rel="stylesheet">
|
362
|
+
dom_id(Post) # => NoMethodError: undefined method `to_key' for Post:Class
|
303
363
|
```
|
304
364
|
|
305
365
|
After:
|
366
|
+
```ruby
|
367
|
+
dom_id(Post) # => "new_post"
|
368
|
+
```
|
306
369
|
|
370
|
+
*Goulven Champenois*
|
371
|
+
|
372
|
+
* Report `:locals` as part of the data returned by ActionView render instrumentation.
|
373
|
+
|
374
|
+
Before:
|
307
375
|
```ruby
|
308
|
-
|
309
|
-
|
376
|
+
{
|
377
|
+
identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
|
378
|
+
layout: "layouts/application"
|
379
|
+
}
|
310
380
|
```
|
311
381
|
|
312
|
-
|
382
|
+
After:
|
383
|
+
```ruby
|
384
|
+
{
|
385
|
+
identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
|
386
|
+
layout: "layouts/application",
|
387
|
+
locals: {foo: "bar"}
|
388
|
+
}
|
389
|
+
```
|
313
390
|
|
314
|
-
*
|
391
|
+
*Aaron Gough*
|
315
392
|
|
316
|
-
|
393
|
+
* Strip `break_sequence` at the end of `word_wrap`.
|
317
394
|
|
318
|
-
|
395
|
+
This fixes a bug where `word_wrap` didn't properly strip off break sequences that had printable characters.
|
319
396
|
|
320
|
-
|
397
|
+
For example, compare the outputs of this template:
|
321
398
|
|
322
|
-
|
323
|
-
|
399
|
+
```erb
|
400
|
+
# <%= word_wrap("11 22\n33 44", line_width: 2, break_sequence: "\n# ") %>
|
401
|
+
```
|
324
402
|
|
325
|
-
|
326
|
-
<%= form.button "Update" %>
|
327
|
-
<%= form.button "Delete", formmethod: :delete %>
|
328
|
-
<% end %>
|
329
|
-
<%# => <form action="posts/1">
|
330
|
-
=> <input type="hidden" name="_method" value="put">
|
331
|
-
=> <button type="submit">Update</button>
|
332
|
-
=> <button type="submit" formmethod="post" name="_method" value="delete">Delete</button>
|
333
|
-
=> </form>
|
334
|
-
%>
|
403
|
+
Before:
|
335
404
|
|
336
|
-
|
405
|
+
```
|
406
|
+
# 11
|
407
|
+
# 22
|
408
|
+
#
|
409
|
+
# 33
|
410
|
+
# 44
|
411
|
+
#
|
412
|
+
```
|
337
413
|
|
338
|
-
|
339
|
-
`<button>` element, regardless of whether or not the content is passed as
|
340
|
-
the first argument or as a block.
|
414
|
+
After:
|
341
415
|
|
342
|
-
|
343
|
-
|
416
|
+
```
|
417
|
+
# 11
|
418
|
+
# 22
|
419
|
+
# 33
|
420
|
+
# 44
|
421
|
+
```
|
344
422
|
|
345
|
-
|
346
|
-
Delete
|
347
|
-
<% end %>
|
348
|
-
# => <form action="/posts/1"><input type="hidden" name="_method" value="delete"><button type="submit">Delete</button></form>
|
423
|
+
*Max Chernyak*
|
349
424
|
|
350
|
-
|
425
|
+
* Allow templates to set strict `locals`.
|
351
426
|
|
352
|
-
|
353
|
-
the `Link` header being added by default when using `stylesheet_link_tag`
|
354
|
-
and `javascript_include_tag`.
|
427
|
+
By default, templates will accept any `locals` as keyword arguments. To define what `locals` a template accepts, add a `locals` magic comment:
|
355
428
|
|
356
|
-
|
429
|
+
```erb
|
430
|
+
<%# locals: (message:) -%>
|
431
|
+
<%= message %>
|
432
|
+
```
|
357
433
|
|
358
|
-
|
359
|
-
specified, instead of always returning `nil`.
|
434
|
+
Default values can also be provided:
|
360
435
|
|
361
|
-
|
436
|
+
```erb
|
437
|
+
<%# locals: (message: "Hello, world!") -%>
|
438
|
+
<%= message %>
|
439
|
+
```
|
440
|
+
|
441
|
+
Or `locals` can be disabled entirely:
|
362
442
|
|
363
|
-
|
364
|
-
|
443
|
+
```erb
|
444
|
+
<%# locals: () %>
|
445
|
+
```
|
365
446
|
|
366
|
-
|
367
|
-
lazy loading images sitewide, without changing view code.
|
447
|
+
*Joel Hawksley*
|
368
448
|
|
369
|
-
|
449
|
+
* Add `include_seconds` option for `datetime_local_field`
|
370
450
|
|
371
|
-
|
372
|
-
of the `<form>` element's `id` attribute. With a `method` argument, returns
|
373
|
-
the `id` attribute for a form field with that name.
|
451
|
+
This allows to omit seconds part in the input field, by passing `include_seconds: false`
|
374
452
|
|
375
|
-
|
376
|
-
<%# ... %>
|
453
|
+
*Wojciech Wnętrzak*
|
377
454
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
455
|
+
* Guard against `ActionView::Helpers::FormTagHelper#field_name` calls with nil
|
456
|
+
`object_name` arguments. For example:
|
457
|
+
|
458
|
+
```erb
|
459
|
+
<%= fields do |f| %>
|
460
|
+
<%= f.field_name :body %>
|
461
|
+
<% end %>
|
462
|
+
```
|
382
463
|
|
383
464
|
*Sean Doyle*
|
384
465
|
|
385
|
-
* `
|
386
|
-
the FormBuilder for the given attribute name.
|
466
|
+
* Strings returned from `strip_tags` are correctly tagged `html_safe?`
|
387
467
|
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
<%= tag.span("is blank", id: f.field_id(:title, :error) %>
|
392
|
-
<% end %>
|
468
|
+
Because these strings contain no HTML elements and the basic entities are escaped, they are safe
|
469
|
+
to be included as-is as PCDATA in HTML content. Tagging them as html-safe avoids double-escaping
|
470
|
+
entities when being concatenated to a SafeBuffer during rendering.
|
393
471
|
|
394
|
-
|
472
|
+
Fixes [rails/rails-html-sanitizer#124](https://github.com/rails/rails-html-sanitizer/issues/124)
|
395
473
|
|
396
|
-
*
|
397
|
-
interpolated into ERB.
|
474
|
+
*Mike Dalessio*
|
398
475
|
|
399
|
-
|
400
|
-
|
476
|
+
* Move `convert_to_model` call from `form_for` into `form_with`
|
477
|
+
|
478
|
+
Now that `form_for` is implemented in terms of `form_with`, remove the
|
479
|
+
`convert_to_model` call from `form_for`.
|
401
480
|
|
402
481
|
*Sean Doyle*
|
403
482
|
|
483
|
+
* Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
|
484
|
+
|
485
|
+
Escape dangerous characters in names of tags and names of attributes in the
|
486
|
+
tag helpers, following the XML specification. Rename the option
|
487
|
+
`:escape_attributes` to `:escape`, to simplify by applying the option to the
|
488
|
+
whole tag.
|
489
|
+
|
490
|
+
*Álvaro Martín Fraguas*
|
491
|
+
|
492
|
+
* Extend audio_tag and video_tag to accept Active Storage attachments.
|
493
|
+
|
494
|
+
Now it's possible to write
|
495
|
+
|
496
|
+
```ruby
|
497
|
+
audio_tag(user.audio_file)
|
498
|
+
video_tag(user.video_file)
|
499
|
+
```
|
500
|
+
|
501
|
+
Instead of
|
502
|
+
|
503
|
+
```ruby
|
504
|
+
audio_tag(polymorphic_path(user.audio_file))
|
505
|
+
video_tag(polymorphic_path(user.video_file))
|
506
|
+
```
|
507
|
+
|
508
|
+
`image_tag` already supported that, so this follows the same pattern.
|
509
|
+
|
510
|
+
*Matheus Richard*
|
511
|
+
|
512
|
+
* Ensure models passed to `form_for` attempt to call `to_model`.
|
513
|
+
|
514
|
+
*Sean Doyle*
|
404
515
|
|
405
|
-
Please check [
|
516
|
+
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionview/CHANGELOG.md) for previous changes.
|