actionview 7.0.8.7 → 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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +309 -321
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/app/assets/javascripts/rails-ujs.esm.js +686 -0
  6. data/app/assets/javascripts/rails-ujs.js +630 -0
  7. data/lib/action_view/base.rb +34 -14
  8. data/lib/action_view/buffers.rb +106 -8
  9. data/lib/action_view/cache_expiry.rb +40 -43
  10. data/lib/action_view/context.rb +1 -1
  11. data/lib/action_view/deprecator.rb +7 -0
  12. data/lib/action_view/digestor.rb +1 -1
  13. data/lib/action_view/gem_version.rb +4 -4
  14. data/lib/action_view/helpers/active_model_helper.rb +1 -1
  15. data/lib/action_view/helpers/asset_tag_helper.rb +136 -52
  16. data/lib/action_view/helpers/asset_url_helper.rb +6 -5
  17. data/lib/action_view/helpers/atom_feed_helper.rb +5 -5
  18. data/lib/action_view/helpers/cache_helper.rb +7 -13
  19. data/lib/action_view/helpers/capture_helper.rb +30 -10
  20. data/lib/action_view/helpers/content_exfiltration_prevention_helper.rb +70 -0
  21. data/lib/action_view/helpers/controller_helper.rb +6 -0
  22. data/lib/action_view/helpers/csp_helper.rb +2 -2
  23. data/lib/action_view/helpers/csrf_helper.rb +2 -2
  24. data/lib/action_view/helpers/date_helper.rb +17 -19
  25. data/lib/action_view/helpers/debug_helper.rb +3 -3
  26. data/lib/action_view/helpers/form_helper.rb +54 -25
  27. data/lib/action_view/helpers/form_options_helper.rb +2 -1
  28. data/lib/action_view/helpers/form_tag_helper.rb +49 -15
  29. data/lib/action_view/helpers/javascript_helper.rb +1 -0
  30. data/lib/action_view/helpers/number_helper.rb +37 -330
  31. data/lib/action_view/helpers/output_safety_helper.rb +2 -2
  32. data/lib/action_view/helpers/rendering_helper.rb +1 -1
  33. data/lib/action_view/helpers/sanitize_helper.rb +51 -21
  34. data/lib/action_view/helpers/tag_helper.rb +5 -27
  35. data/lib/action_view/helpers/tags/base.rb +11 -52
  36. data/lib/action_view/helpers/tags/collection_check_boxes.rb +1 -0
  37. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +1 -0
  38. data/lib/action_view/helpers/tags/collection_select.rb +3 -0
  39. data/lib/action_view/helpers/tags/date_field.rb +1 -1
  40. data/lib/action_view/helpers/tags/date_select.rb +2 -0
  41. data/lib/action_view/helpers/tags/datetime_field.rb +14 -6
  42. data/lib/action_view/helpers/tags/datetime_local_field.rb +11 -2
  43. data/lib/action_view/helpers/tags/grouped_collection_select.rb +3 -0
  44. data/lib/action_view/helpers/tags/month_field.rb +1 -1
  45. data/lib/action_view/helpers/tags/select.rb +3 -0
  46. data/lib/action_view/helpers/tags/select_renderer.rb +56 -0
  47. data/lib/action_view/helpers/tags/time_field.rb +1 -1
  48. data/lib/action_view/helpers/tags/time_zone_select.rb +3 -0
  49. data/lib/action_view/helpers/tags/week_field.rb +1 -1
  50. data/lib/action_view/helpers/tags/weekday_select.rb +3 -0
  51. data/lib/action_view/helpers/tags.rb +2 -0
  52. data/lib/action_view/helpers/text_helper.rb +156 -84
  53. data/lib/action_view/helpers/translation_helper.rb +3 -3
  54. data/lib/action_view/helpers/url_helper.rb +46 -17
  55. data/lib/action_view/helpers.rb +2 -0
  56. data/lib/action_view/layouts.rb +8 -6
  57. data/lib/action_view/log_subscriber.rb +49 -32
  58. data/lib/action_view/lookup_context.rb +29 -13
  59. data/lib/action_view/path_registry.rb +57 -0
  60. data/lib/action_view/path_set.rb +13 -14
  61. data/lib/action_view/railtie.rb +26 -3
  62. data/lib/action_view/record_identifier.rb +15 -8
  63. data/lib/action_view/renderer/abstract_renderer.rb +1 -1
  64. data/lib/action_view/renderer/collection_renderer.rb +10 -2
  65. data/lib/action_view/renderer/partial_renderer/collection_caching.rb +2 -1
  66. data/lib/action_view/renderer/partial_renderer.rb +2 -1
  67. data/lib/action_view/renderer/renderer.rb +2 -0
  68. data/lib/action_view/renderer/streaming_template_renderer.rb +3 -2
  69. data/lib/action_view/renderer/template_renderer.rb +3 -2
  70. data/lib/action_view/rendering.rb +22 -4
  71. data/lib/action_view/ripper_ast_parser.rb +5 -5
  72. data/lib/action_view/template/error.rb +14 -1
  73. data/lib/action_view/template/handlers/builder.rb +4 -4
  74. data/lib/action_view/template/handlers/erb/erubi.rb +23 -27
  75. data/lib/action_view/template/handlers/erb.rb +73 -1
  76. data/lib/action_view/template/handlers.rb +1 -1
  77. data/lib/action_view/template/html.rb +1 -1
  78. data/lib/action_view/template/raw_file.rb +1 -1
  79. data/lib/action_view/template/renderable.rb +1 -1
  80. data/lib/action_view/template/resolver.rb +10 -2
  81. data/lib/action_view/template/text.rb +1 -1
  82. data/lib/action_view/template/types.rb +25 -34
  83. data/lib/action_view/template.rb +249 -54
  84. data/lib/action_view/template_path.rb +2 -0
  85. data/lib/action_view/test_case.rb +176 -21
  86. data/lib/action_view/unbound_template.rb +17 -7
  87. data/lib/action_view/version.rb +1 -1
  88. data/lib/action_view/view_paths.rb +15 -24
  89. data/lib/action_view.rb +4 -1
  90. metadata +22 -23
  91. data/lib/assets/compiled/rails-ujs.js +0 -777
data/CHANGELOG.md CHANGED
@@ -1,528 +1,516 @@
1
- ## Rails 7.0.8.7 (December 10, 2024) ##
1
+ ## Rails 7.1.5.1 (December 10, 2024) ##
2
2
 
3
3
  * No changes.
4
4
 
5
5
 
6
- ## Rails 7.0.8.6 (October 23, 2024) ##
6
+ ## Rails 7.1.5 (October 30, 2024) ##
7
7
 
8
8
  * No changes.
9
9
 
10
10
 
11
- ## Rails 7.0.8.5 (October 15, 2024) ##
11
+ ## Rails 7.1.4.2 (October 23, 2024) ##
12
12
 
13
13
  * No changes.
14
14
 
15
15
 
16
- ## Rails 7.0.8.4 (June 04, 2024) ##
16
+ ## Rails 7.1.4.1 (October 15, 2024) ##
17
17
 
18
18
  * No changes.
19
19
 
20
20
 
21
- ## Rails 7.0.8.3 (May 17, 2024) ##
21
+ ## Rails 7.1.4 (August 22, 2024) ##
22
22
 
23
- * No changes.
24
-
25
-
26
- ## Rails 7.0.8.2 (May 16, 2024) ##
27
-
28
- * No changes.
29
-
30
-
31
- ## Rails 7.0.8.1 (February 21, 2024) ##
23
+ * Action View Test Case `rendered` memoization.
32
24
 
33
- * No changes.
34
-
35
-
36
- ## Rails 7.0.8 (September 09, 2023) ##
37
-
38
- * Fix `form_for` missing the hidden `_method` input for models with a
39
- namespaced route.
40
-
41
- *Hartley McGuire*
42
-
43
- * Fix `render collection: @records, cache: true` inside `jbuilder` templates
25
+ *Sean Doyle*
44
26
 
45
- The previous fix that shipped in `7.0.7` assumed template fragments are always strings,
46
- this isn't true with `jbuilder`.
27
+ * Restore the ability for templates to return any kind of object and not just strings
47
28
 
48
29
  *Jean Boussier*
49
30
 
50
- ## Rails 7.0.7.2 (August 22, 2023) ##
31
+ * Fix threading issue with strict locals.
51
32
 
52
- * No changes.
33
+ *Robert Fletcher*
53
34
 
54
35
 
55
- ## Rails 7.0.7.1 (August 22, 2023) ##
36
+ ## Rails 7.1.3.4 (June 04, 2024) ##
56
37
 
57
38
  * No changes.
58
39
 
59
40
 
60
- ## Rails 7.0.7 (August 09, 2023) ##
61
-
62
- * Fix `render collection: @records, cache: true` to cache fragments as bare strings
63
-
64
- Previously it would incorrectly cache them as Action View buffers.
65
-
66
- *Jean Boussier*
67
-
68
- * Don't double-encode nested `field_id` and `field_name` index values
69
-
70
- Pass `index: @options` as a default keyword argument to `field_id` and
71
- `field_name` view helper methods.
72
-
73
- *Sean Doyle*
74
-
75
-
76
- ## Rails 7.0.6 (June 29, 2023) ##
41
+ ## Rails 7.1.3.3 (May 16, 2024) ##
77
42
 
78
43
  * No changes.
79
44
 
80
45
 
81
- ## Rails 7.0.5.1 (June 26, 2023) ##
46
+ ## Rails 7.1.3.2 (February 21, 2024) ##
82
47
 
83
48
  * No changes.
84
49
 
85
50
 
86
- ## Rails 7.0.5 (May 24, 2023) ##
87
-
88
- * `FormBuilder#id` finds id set by `form_for` and `form_with`.
89
-
90
- *Matt Polito*
91
-
92
- * Allow all available locales for template lookups.
51
+ ## Rails 7.1.3.1 (February 21, 2024) ##
93
52
 
94
- *Ben Dilley*
95
-
96
- * Choices of `select` can optionally contain html attributes as the last element
97
- of the child arrays when using grouped/nested collections
53
+ * No changes.
98
54
 
99
- ```erb
100
- <%= form.select :foo, [["North America", [["United States","US"],["Canada","CA"]], { disabled: "disabled" }]] %>
101
- # => <select><optgroup label="North America" disabled="disabled"><option value="US">United States</option><option value="CA">Canada</option></optgroup></select>
102
- ```
103
55
 
104
- *Chris Gunther*
56
+ ## Rails 7.1.3 (January 16, 2024) ##
105
57
 
58
+ * Better handle SyntaxError in Action View.
106
59
 
107
- ## Rails 7.0.4.3 (March 13, 2023) ##
60
+ *Mario Caropreso*
108
61
 
109
- * Ignore certain data-* attributes in rails-ujs when element is contenteditable
62
+ * Fix `word_wrap` with empty string.
110
63
 
111
- [CVE-2023-23913]
64
+ *Jonathan Hefner*
112
65
 
66
+ * Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`.
113
67
 
114
- ## Rails 7.0.4.2 (January 24, 2023) ##
68
+ Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`.
115
69
 
116
- * No changes.
70
+ *Sean Doyle*
117
71
 
72
+ * Fix detection of required strict locals.
118
73
 
119
- ## Rails 7.0.4.1 (January 17, 2023) ##
74
+ Further fix `render @collection` compatibility with strict locals
120
75
 
121
- * No changes.
76
+ *Jean Boussier*
122
77
 
123
78
 
124
- ## Rails 7.0.4 (September 09, 2022) ##
79
+ ## Rails 7.1.2 (November 10, 2023) ##
125
80
 
126
- * Guard against `ActionView::Helpers::FormTagHelper#field_name` calls with nil
127
- `object_name` arguments. For example:
81
+ * Fix the `number_to_human_size` view helper to correctly work with negative numbers.
128
82
 
129
- ```erb
130
- <%= fields do |f| %>
131
- <%= f.field_name :body %>
132
- <% end %>
133
- ```
83
+ *Earlopain*
134
84
 
135
- *Sean Doyle*
85
+ * Automatically discard the implicit locals injected by collection rendering for template that can't accept them
136
86
 
137
- * Strings returned from `strip_tags` are correctly tagged `html_safe?`
87
+ When rendering a collection, two implicit variables are injected, which breaks templates with strict locals.
138
88
 
139
- Because these strings contain no HTML elements and the basic entities are escaped, they are safe
140
- to be included as-is as PCDATA in HTML content. Tagging them as html-safe avoids double-escaping
141
- entities when being concatenated to a SafeBuffer during rendering.
89
+ Now they are only passed if the template will actually accept them.
142
90
 
143
- Fixes [rails/rails-html-sanitizer#124](https://github.com/rails/rails-html-sanitizer/issues/124)
91
+ *Yasha Krasnou*, *Jean Boussier*
144
92
 
145
- *Mike Dalessio*
93
+ * Fix `@rails/ujs` calling `start()` an extra time when using bundlers
146
94
 
147
- ## Rails 7.0.3.1 (July 12, 2022) ##
95
+ *Hartley McGuire*, *Ryunosuke Sato*
148
96
 
149
- * No changes.
97
+ * Fix the `capture` view helper compatibility with HAML and Slim
150
98
 
99
+ When a blank string was captured in HAML or Slim (and possibly other template engines)
100
+ it would instead return the entire buffer.
151
101
 
152
- ## Rails 7.0.3 (May 09, 2022) ##
102
+ *Jean Boussier*
153
103
 
154
- * Ensure models passed to `form_for` attempt to call `to_model`.
155
104
 
156
- *Sean Doyle*
105
+ ## Rails 7.1.1 (October 11, 2023) ##
157
106
 
158
- ## Rails 7.0.2.4 (April 26, 2022) ##
107
+ * Updated `@rails/ujs` files to ignore certain data-* attributes when element is contenteditable.
159
108
 
160
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
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)]
161
111
 
162
- Escape dangerous characters in names of tags and names of attributes in the
163
- tag helpers, following the XML specification. Rename the option
164
- `:escape_attributes` to `:escape`, to simplify by applying the option to the
165
- whole tag.
112
+ *Ryunosuke Sato*
166
113
 
167
- *Álvaro Martín Fraguas*
168
114
 
169
- ## Rails 7.0.2.3 (March 08, 2022) ##
115
+ ## Rails 7.1.0 (October 05, 2023) ##
170
116
 
171
117
  * No changes.
172
118
 
173
119
 
174
- ## Rails 7.0.2.2 (February 11, 2022) ##
120
+ ## Rails 7.1.0.rc2 (October 01, 2023) ##
175
121
 
176
122
  * No changes.
177
123
 
178
124
 
179
- ## Rails 7.0.2.1 (February 11, 2022) ##
180
-
181
- * No changes.
125
+ ## Rails 7.1.0.rc1 (September 27, 2023) ##
182
126
 
127
+ * Introduce `ActionView::TestCase.register_parser`
183
128
 
184
- ## Rails 7.0.2 (February 08, 2022) ##
185
-
186
- * Ensure `preload_link_tag` preloads JavaScript modules correctly.
129
+ ```ruby
130
+ register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }
187
131
 
188
- *Máximo Mussini*
132
+ test "renders RSS" do
133
+ article = Article.create!(title: "Hello, world")
189
134
 
190
- * Fix `stylesheet_link_tag` and similar helpers are being used to work in objects with
191
- a `response` method.
135
+ render formats: :rss, partial: article
192
136
 
193
- *dark-panda*
137
+ assert_equal "Hello, world", rendered.rss.items.last.title
138
+ end
139
+ ```
194
140
 
141
+ By default, register parsers for `:html` and `:json`.
195
142
 
196
- ## Rails 7.0.1 (January 06, 2022) ##
143
+ *Sean Doyle*
197
144
 
198
- * Fix `button_to` to work with a hash parameter as URL.
199
145
 
200
- *MingyuanQin*
146
+ ## Rails 7.1.0.beta1 (September 13, 2023) ##
201
147
 
202
- * Fix `link_to` with a model passed as an argument twice.
148
+ * Fix `simple_format` with blank `wrapper_tag` option returns plain html tag
203
149
 
204
- *Alex Ghiculescu*
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.
205
152
 
153
+ Before:
206
154
 
207
- ## Rails 7.0.0 (December 15, 2021) ##
155
+ ```ruby
156
+ simple_format("Hello World", {}, { wrapper_tag: nil })
157
+ # <>Hello World</>
158
+ ```
208
159
 
209
- * Support `include_hidden:` option in calls to
210
- `ActionView::Helper::FormBuilder#file_field` with `multiple: true` to
211
- support submitting an empty collection of files.
160
+ After:
212
161
 
213
162
  ```ruby
214
- form.file_field :attachments, multiple: true
215
- # => <input type="hidden" autocomplete="off" name="post[attachments][]" value="">
216
- <input type="file" multiple="multiple" id="post_attachments" name="post[attachments][]">
217
-
218
- form.file_field :attachments, multiple: true, include_hidden: false
219
- # => <input type="file" multiple="multiple" id="post_attachments" name="post[attachments][]">
163
+ simple_format("Hello World", {}, { wrapper_tag: nil })
164
+ # <p>Hello World</p>
220
165
  ```
221
166
 
222
- *Sean Doyle*
167
+ *Akhil G Krishnan*, *Junichi Ito*
223
168
 
224
- * Fix `number_with_precision(raise: true)` always raising even on valid numbers.
169
+ * Don't double-encode nested `field_id` and `field_name` index values
225
170
 
226
- *Pedro Moreira*
171
+ Pass `index: @options` as a default keyword argument to `field_id` and
172
+ `field_name` view helper methods.
227
173
 
174
+ *Sean Doyle*
228
175
 
229
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
176
+ * Allow opting in/out of `Link preload` headers when calling `stylesheet_link_tag` or `javascript_include_tag`
230
177
 
231
- * No changes.
178
+ ```ruby
179
+ # will exclude header, even if setting is enabled:
180
+ javascript_include_tag("http://example.com/all.js", preload_links_header: false)
232
181
 
182
+ # will include header, even if setting is disabled:
183
+ stylesheet_link_tag("http://example.com/all.js", preload_links_header: true)
184
+ ```
233
185
 
234
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
186
+ *Alex Ghiculescu*
235
187
 
236
- * No changes.
188
+ * Stop generating `Link preload` headers once it has reached 1KB.
237
189
 
238
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
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.
239
192
 
240
- * Support `fields model: [@nested, @model]` the same way as `form_with model:
241
- [@nested, @model]`.
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.
242
195
 
243
- *Sean Doyle*
196
+ *Jean Boussier*
244
197
 
245
- * Infer HTTP verb `[method]` from a model or Array with model as the first
246
- argument to `button_to` when combined with a block:
198
+ * `simple_format` helper now handles a `:sanitize_options` - any extra options you want appending to the sanitize.
247
199
 
200
+ Before:
248
201
  ```ruby
249
- button_to(Workshop.find(1)){ "Update" }
250
- #=> <form method="post" action="/workshops/1" class="button_to">
251
- #=> <input type="hidden" name="_method" value="patch" autocomplete="off" />
252
- #=> <button type="submit">Update</button>
253
- #=> </form>
254
-
255
- button_to([ Workshop.find(1), Session.find(1) ]) { "Update" }
256
- #=> <form method="post" action="/workshops/1/sessions/1" class="button_to">
257
- #=> <input type="hidden" name="_method" value="patch" autocomplete="off" />
258
- #=> <button type="submit">Update</button>
259
- #=> </form>
202
+ simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>")
203
+ # => "<p><a href=\"http://example.com\">Continue</a></p>"
260
204
  ```
261
205
 
262
- *Sean Doyle*
263
-
264
- * Support passing a Symbol as the first argument to `FormBuilder#button`:
265
-
206
+ After:
266
207
  ```ruby
267
- form.button(:draft, value: true)
268
- # => <button name="post[draft]" value="true" type="submit">Create post</button>
269
-
270
- form.button(:draft, value: true) do
271
- content_tag(:strong, "Save as draft")
272
- end
273
- # => <button name="post[draft]" value="true" type="submit">
274
- # <strong>Save as draft</strong>
275
- # </button>
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>"
276
210
  ```
277
211
 
278
- *Sean Doyle*
212
+ *Andrei Andriichuk*
279
213
 
280
- * Introduce the `field_name` view helper, along with the
281
- `FormBuilder#field_name` counterpart:
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.
282
216
 
283
- ```ruby
284
- form_for @post do |f|
285
- f.field_tag :tag, name: f.field_name(:tag, multiple: true)
286
- # => <input type="text" name="post[tag][]">
287
- end
288
- ```
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`.
289
220
 
290
- *Sean Doyle*
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`.
291
224
 
292
- * Execute the `ActionView::Base.field_error_proc` within the context of the
293
- `ActionView::Base` instance:
225
+ *Mike Dalessio*
294
226
 
295
- ```ruby
296
- config.action_view.field_error_proc = proc { |html| content_tag(:div, html, class: "field_with_errors") }
297
- ```
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.
298
230
 
299
- *Sean Doyle*
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.
300
234
 
301
- * Add support for `button_to ..., authenticity_token: false`
235
+ *Mike Dalessio*
302
236
 
303
- ```ruby
304
- button_to "Create", Post.new, authenticity_token: false
305
- # => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button></form>
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.
306
241
 
307
- button_to "Create", Post.new, authenticity_token: true
308
- # => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button><input type="hidden" name="form_token" value="abc123..." autocomplete="off" /></form>
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
+ ```
309
252
 
310
- button_to "Create", Post.new, authenticity_token: "secret"
311
- # => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button><input type="hidden" name="form_token" value="secret" autocomplete="off" /></form>
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>
312
264
  ```
313
265
 
314
- *Sean Doyle*
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
+ ```
315
282
 
316
- * Support rendering `<form>` elements _without_ `[action]` attributes by:
283
+ *Juan Pablo Balarini*
317
284
 
318
- * `form_with url: false` or `form_with ..., html: { action: false }`
319
- * `form_for ..., url: false` or `form_for ..., html: { action: false }`
320
- * `form_tag false` or `form_tag ..., action: false`
321
- * `button_to "...", false` or `button_to(false) { ... }`
285
+ * Remove deprecated support to passing instance variables as locals to partials.
322
286
 
323
- *Sean Doyle*
287
+ *Rafael Mendonça França*
324
288
 
325
- * Add `:day_format` option to `date_select`
289
+ * Remove deprecated constant `ActionView::Path`.
326
290
 
327
- date_select("article", "written_on", day_format: ->(day) { day.ordinalize })
328
- # generates day options like <option value="1">1st</option>\n<option value="2">2nd</option>...
291
+ *Rafael Mendonça França*
329
292
 
330
- *Shunichi Ikegami*
293
+ * Guard `token_list` calls from escaping HTML too often
331
294
 
332
- * Allow `link_to` helper to infer link name from `Model#to_s` when it
333
- is used with a single argument:
295
+ *Sean Doyle*
334
296
 
335
- link_to @profile
336
- #=> <a href="/profiles/1">Eileen</a>
297
+ * `select` can now be called with a single hash containing options and some HTML options
337
298
 
338
- This assumes the model class implements a `to_s` method like this:
299
+ Previously this would not work as expected:
339
300
 
340
- class Profile < ApplicationRecord
341
- # ...
342
- def to_s
343
- name
344
- end
345
- end
301
+ ```erb
302
+ <%= select :post, :author, authors, required: true %>
303
+ ```
346
304
 
347
- Previously you had to supply a second argument even if the `Profile`
348
- model implemented a `#to_s` method that called the `name` method.
305
+ Instead you needed to do this:
349
306
 
350
- link_to @profile, @profile.name
351
- #=> <a href="/profiles/1">Eileen</a>
307
+ ```erb
308
+ <%= select :post, :author, authors, {}, required: true %>
309
+ ```
352
310
 
353
- *Olivier Lacan*
311
+ Now, either form is accepted, for the following HTML attributes: `required`, `multiple`, `size`.
354
312
 
355
- * Support svg unpaired tags for `tag` helper.
313
+ *Alex Ghiculescu*
356
314
 
357
- tag.svg { tag.use('href' => "#cool-icon") }
358
- # => <svg><use href="#cool-icon"></svg>
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.
359
316
 
360
- *Oleksii Vasyliev*
317
+ Before:
318
+ ```erb
319
+ <%= form.datetime_field :written_at, value: Time.current.strftime("%Y-%m-%dT%T") %>
320
+ ```
361
321
 
322
+ After:
323
+ ```erb
324
+ <%= form.datetime_field :written_at, value: Time.current %>
325
+ ```
362
326
 
363
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
327
+ *Andrey Samsonov*
364
328
 
365
- * No changes.
329
+ * Choices of `select` can optionally contain html attributes as the last element
330
+ of the child arrays when using grouped/nested collections
366
331
 
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
+ ```
367
336
 
368
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
337
+ *Chris Gunther*
369
338
 
370
- * Improves the performance of ActionView::Helpers::NumberHelper formatters by avoiding the use of
371
- exceptions as flow control.
339
+ * `check_box_tag` and `radio_button_tag` now accept `checked` as a keyword argument
372
340
 
373
- *Mike Dalessio*
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:
374
343
 
375
- * `preload_link_tag` properly inserts `as` attributes for files with `image` MIME types, such as JPG or SVG.
344
+ ```erb
345
+ = check_box_tag "admin", "1", false
346
+ = check_box_tag "admin", "1", checked: false
376
347
 
377
- *Nate Berkopec*
348
+ = radio_button_tag 'favorite_color', 'maroon', false
349
+ = radio_button_tag 'favorite_color', 'maroon', checked: false
350
+ ```
378
351
 
379
- * Add `weekday_options_for_select` and `weekday_select` helper methods. Also adds `weekday_select` to `FormBuilder`.
352
+ *Alex Ghiculescu*
380
353
 
381
- *Drew Bragg*, *Dana Kashubeck*, *Kasper Timm Hansen*
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.
382
359
 
383
- * Add `caching?` helper that returns whether the current code path is being cached and `uncacheable!` to denote helper methods that can't participate in fragment caching.
360
+ Before:
361
+ ```ruby
362
+ dom_id(Post) # => NoMethodError: undefined method `to_key' for Post:Class
363
+ ```
384
364
 
385
- *Ben Toews*, *John Hawthorn*, *Kasper Timm Hansen*, *Joel Hawksley*
365
+ After:
366
+ ```ruby
367
+ dom_id(Post) # => "new_post"
368
+ ```
386
369
 
387
- * Add `include_seconds` option for `time_field`.
370
+ *Goulven Champenois*
388
371
 
389
- <%= form.time_field :foo, include_seconds: false %>
390
- # => <input value="16:22" type="time" />
372
+ * Report `:locals` as part of the data returned by ActionView render instrumentation.
391
373
 
392
- Default includes seconds:
374
+ Before:
375
+ ```ruby
376
+ {
377
+ identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
378
+ layout: "layouts/application"
379
+ }
380
+ ```
393
381
 
394
- <%= form.time_field :foo %>
395
- # => <input value="16:22:01.440" type="time" />
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
+ ```
396
390
 
397
- This allows you to take advantage of [different rendering options](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/time#time_value_format) in some browsers.
391
+ *Aaron Gough*
398
392
 
399
- *Alex Ghiculescu*
393
+ * Strip `break_sequence` at the end of `word_wrap`.
400
394
 
401
- * Improve error messages when template file does not exist at absolute filepath.
395
+ This fixes a bug where `word_wrap` didn't properly strip off break sequences that had printable characters.
402
396
 
403
- *Ted Whang*
397
+ For example, compare the outputs of this template:
404
398
 
405
- * Add `:country_code` option to `sms_to` for consistency with `phone_to`.
399
+ ```erb
400
+ # <%= word_wrap("11 22\n33 44", line_width: 2, break_sequence: "\n# ") %>
401
+ ```
406
402
 
407
- *Jonathan Hefner*
403
+ Before:
408
404
 
409
- * OpenSSL constants are now used for Digest computations.
405
+ ```
406
+ # 11
407
+ # 22
408
+ #
409
+ # 33
410
+ # 44
411
+ #
412
+ ```
410
413
 
411
- *Dirkjan Bussink*
414
+ After:
412
415
 
413
- * The `translate` helper now passes `default` values that aren't
414
- translation keys through `I18n.translate` for interpolation.
416
+ ```
417
+ # 11
418
+ # 22
419
+ # 33
420
+ # 44
421
+ ```
415
422
 
416
- *Jonathan Hefner*
423
+ *Max Chernyak*
417
424
 
418
- * Adds option `extname` to `stylesheet_link_tag` to skip default
419
- `.css` extension appended to the stylesheet path.
425
+ * Allow templates to set strict `locals`.
420
426
 
421
- Before:
427
+ By default, templates will accept any `locals` as keyword arguments. To define what `locals` a template accepts, add a `locals` magic comment:
422
428
 
423
- ```ruby
424
- stylesheet_link_tag "style.less"
425
- # <link href="/stylesheets/style.less.scss" rel="stylesheet">
429
+ ```erb
430
+ <%# locals: (message:) -%>
431
+ <%= message %>
426
432
  ```
427
433
 
428
- After:
434
+ Default values can also be provided:
429
435
 
430
- ```ruby
431
- stylesheet_link_tag "style.less", extname: false, skip_pipeline: true, rel: "stylesheet/less"
432
- # <link href="/stylesheets/style.less" rel="stylesheet/less">
436
+ ```erb
437
+ <%# locals: (message: "Hello, world!") -%>
438
+ <%= message %>
433
439
  ```
434
440
 
435
- *Abhay Nikam*
441
+ Or `locals` can be disabled entirely:
436
442
 
437
- * Deprecate `render` locals to be assigned to instance variables.
438
-
439
- *Petrik de Heus*
443
+ ```erb
444
+ <%# locals: () %>
445
+ ```
440
446
 
441
- * Remove legacy default `media=screen` from `stylesheet_link_tag`.
447
+ *Joel Hawksley*
442
448
 
443
- *André Luis Leal Cardoso Junior*
449
+ * Add `include_seconds` option for `datetime_local_field`
444
450
 
445
- * Change `ActionView::Helpers::FormBuilder#button` to transform `formmethod`
446
- attributes into `_method="$VERB"` Form Data to enable varied same-form actions:
451
+ This allows to omit seconds part in the input field, by passing `include_seconds: false`
447
452
 
448
- <%= form_with model: post, method: :put do %>
449
- <%= form.button "Update" %>
450
- <%= form.button "Delete", formmethod: :delete %>
451
- <% end %>
452
- <%# => <form action="posts/1">
453
- => <input type="hidden" name="_method" value="put">
454
- => <button type="submit">Update</button>
455
- => <button type="submit" formmethod="post" name="_method" value="delete">Delete</button>
456
- => </form>
457
- %>
453
+ *Wojciech Wnętrzak*
458
454
 
459
- *Sean Doyle*
455
+ * Guard against `ActionView::Helpers::FormTagHelper#field_name` calls with nil
456
+ `object_name` arguments. For example:
460
457
 
461
- * Change `ActionView::Helpers::UrlHelper#button_to` to *always* render a
462
- `<button>` element, regardless of whether or not the content is passed as
463
- the first argument or as a block.
458
+ ```erb
459
+ <%= fields do |f| %>
460
+ <%= f.field_name :body %>
461
+ <% end %>
462
+ ```
464
463
 
465
- <%= button_to "Delete", post_path(@post), method: :delete %>
466
- # => <form action="/posts/1"><input type="hidden" name="_method" value="delete"><button type="submit">Delete</button></form>
464
+ *Sean Doyle*
467
465
 
468
- <%= button_to post_path(@post), method: :delete do %>
469
- Delete
470
- <% end %>
471
- # => <form action="/posts/1"><input type="hidden" name="_method" value="delete"><button type="submit">Delete</button></form>
466
+ * Strings returned from `strip_tags` are correctly tagged `html_safe?`
472
467
 
473
- *Sean Doyle*, *Dusan Orlovic*
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.
474
471
 
475
- * Add `config.action_view.preload_links_header` to allow disabling of
476
- the `Link` header being added by default when using `stylesheet_link_tag`
477
- and `javascript_include_tag`.
472
+ Fixes [rails/rails-html-sanitizer#124](https://github.com/rails/rails-html-sanitizer/issues/124)
478
473
 
479
- *Andrew White*
474
+ *Mike Dalessio*
480
475
 
481
- * The `translate` helper now resolves `default` values when a `nil` key is
482
- specified, instead of always returning `nil`.
476
+ * Move `convert_to_model` call from `form_for` into `form_with`
483
477
 
484
- *Jonathan Hefner*
478
+ Now that `form_for` is implemented in terms of `form_with`, remove the
479
+ `convert_to_model` call from `form_for`.
485
480
 
486
- * Add `config.action_view.image_loading` to configure the default value of
487
- the `image_tag` `:loading` option.
481
+ *Sean Doyle*
488
482
 
489
- By setting `config.action_view.image_loading = "lazy"`, an application can opt in to
490
- lazy loading images sitewide, without changing view code.
483
+ * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
491
484
 
492
- *Jonathan Hefner*
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.
493
489
 
494
- * `ActionView::Helpers::FormBuilder#id` returns the value
495
- of the `<form>` element's `id` attribute. With a `method` argument, returns
496
- the `id` attribute for a form field with that name.
490
+ *Álvaro Martín Fraguas*
497
491
 
498
- <%= form_for @post do |f| %>
499
- <%# ... %>
492
+ * Extend audio_tag and video_tag to accept Active Storage attachments.
500
493
 
501
- <% content_for :sticky_footer do %>
502
- <%= form.button(form: f.id) %>
503
- <% end %>
504
- <% end %>
494
+ Now it's possible to write
505
495
 
506
- *Sean Doyle*
496
+ ```ruby
497
+ audio_tag(user.audio_file)
498
+ video_tag(user.video_file)
499
+ ```
507
500
 
508
- * `ActionView::Helpers::FormBuilder#field_id` returns the value generated by
509
- the FormBuilder for the given attribute name.
501
+ Instead of
510
502
 
511
- <%= form_for @post do |f| %>
512
- <%= f.label :title %>
513
- <%= f.text_field :title, aria: { describedby: f.field_id(:title, :error) } %>
514
- <%= tag.span("is blank", id: f.field_id(:title, :error) %>
515
- <% end %>
503
+ ```ruby
504
+ audio_tag(polymorphic_path(user.audio_file))
505
+ video_tag(polymorphic_path(user.video_file))
506
+ ```
516
507
 
517
- *Sean Doyle*
508
+ `image_tag` already supported that, so this follows the same pattern.
518
509
 
519
- * Add `tag.attributes` to transform a Hash into HTML Attributes, ready to be
520
- interpolated into ERB.
510
+ *Matheus Richard*
521
511
 
522
- <input <%= tag.attributes(type: :text, aria: { label: "Search" }) %> >
523
- # => <input type="text" aria-label="Search">
512
+ * Ensure models passed to `form_for` attempt to call `to_model`.
524
513
 
525
514
  *Sean Doyle*
526
515
 
527
-
528
- Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/actionview/CHANGELOG.md) for previous changes.
516
+ Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionview/CHANGELOG.md) for previous changes.