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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +343 -232
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -3
  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 +32 -12
  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 +3 -3
  24. data/lib/action_view/helpers/date_helper.rb +67 -59
  25. data/lib/action_view/helpers/debug_helper.rb +3 -3
  26. data/lib/action_view/helpers/form_helper.rb +56 -26
  27. data/lib/action_view/helpers/form_options_helper.rb +4 -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 -329
  31. data/lib/action_view/helpers/output_safety_helper.rb +4 -4
  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 +4 -1
  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 +47 -18
  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 +21 -3
  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 +6 -6
  72. data/lib/action_view/routing_url_for.rb +4 -4
  73. data/lib/action_view/template/error.rb +14 -1
  74. data/lib/action_view/template/handlers/builder.rb +4 -4
  75. data/lib/action_view/template/handlers/erb/erubi.rb +23 -27
  76. data/lib/action_view/template/handlers/erb.rb +73 -1
  77. data/lib/action_view/template/handlers.rb +1 -1
  78. data/lib/action_view/template/html.rb +1 -1
  79. data/lib/action_view/template/raw_file.rb +1 -1
  80. data/lib/action_view/template/renderable.rb +1 -1
  81. data/lib/action_view/template/resolver.rb +15 -5
  82. data/lib/action_view/template/text.rb +1 -1
  83. data/lib/action_view/template/types.rb +25 -34
  84. data/lib/action_view/template.rb +249 -54
  85. data/lib/action_view/template_path.rb +2 -0
  86. data/lib/action_view/test_case.rb +176 -21
  87. data/lib/action_view/unbound_template.rb +17 -7
  88. data/lib/action_view/version.rb +1 -1
  89. data/lib/action_view/view_paths.rb +15 -24
  90. data/lib/action_view.rb +4 -1
  91. metadata +27 -28
  92. data/lib/assets/compiled/rails-ujs.js +0 -746
data/CHANGELOG.md CHANGED
@@ -1,405 +1,516 @@
1
- ## Rails 7.0.4 (September 09, 2022) ##
1
+ ## Rails 7.1.5.1 (December 10, 2024) ##
2
2
 
3
- * Guard against `ActionView::Helpers::FormTagHelper#field_name` calls with nil
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
- *Sean Doyle*
6
+ ## Rails 7.1.5 (October 30, 2024) ##
13
7
 
14
- * Strings returned from `strip_tags` are correctly tagged `html_safe?`
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
- Fixes [rails/rails-html-sanitizer#124](https://github.com/rails/rails-html-sanitizer/issues/124)
11
+ ## Rails 7.1.4.2 (October 23, 2024) ##
21
12
 
22
- *Mike Dalessio*
13
+ * No changes.
23
14
 
24
- ## Rails 7.0.3.1 (July 12, 2022) ##
15
+
16
+ ## Rails 7.1.4.1 (October 15, 2024) ##
25
17
 
26
18
  * No changes.
27
19
 
28
20
 
29
- ## Rails 7.0.3 (May 09, 2022) ##
21
+ ## Rails 7.1.4 (August 22, 2024) ##
30
22
 
31
- * Ensure models passed to `form_for` attempt to call `to_model`.
23
+ * Action View Test Case `rendered` memoization.
32
24
 
33
25
  *Sean Doyle*
34
26
 
35
- ## Rails 7.0.2.4 (April 26, 2022) ##
27
+ * Restore the ability for templates to return any kind of object and not just strings
36
28
 
37
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
29
+ *Jean Boussier*
38
30
 
39
- Escape dangerous characters in names of tags and names of attributes in the
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
- *Álvaro Martín Fraguas*
33
+ *Robert Fletcher*
45
34
 
46
- ## Rails 7.0.2.3 (March 08, 2022) ##
35
+
36
+ ## Rails 7.1.3.4 (June 04, 2024) ##
47
37
 
48
38
  * No changes.
49
39
 
50
40
 
51
- ## Rails 7.0.2.2 (February 11, 2022) ##
41
+ ## Rails 7.1.3.3 (May 16, 2024) ##
52
42
 
53
43
  * No changes.
54
44
 
55
45
 
56
- ## Rails 7.0.2.1 (February 11, 2022) ##
46
+ ## Rails 7.1.3.2 (February 21, 2024) ##
57
47
 
58
48
  * No changes.
59
49
 
60
50
 
61
- ## Rails 7.0.2 (February 08, 2022) ##
51
+ ## Rails 7.1.3.1 (February 21, 2024) ##
62
52
 
63
- * Ensure `preload_link_tag` preloads JavaScript modules correctly.
53
+ * No changes.
64
54
 
65
- *Máximo Mussini*
66
55
 
67
- * Fix `stylesheet_link_tag` and similar helpers are being used to work in objects with
68
- a `response` method.
56
+ ## Rails 7.1.3 (January 16, 2024) ##
69
57
 
70
- *dark-panda*
58
+ * Better handle SyntaxError in Action View.
71
59
 
60
+ *Mario Caropreso*
72
61
 
73
- ## Rails 7.0.1 (January 06, 2022) ##
62
+ * Fix `word_wrap` with empty string.
74
63
 
75
- * Fix `button_to` to work with a hash parameter as URL.
64
+ *Jonathan Hefner*
76
65
 
77
- *MingyuanQin*
66
+ * Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`.
78
67
 
79
- * Fix `link_to` with a model passed as an argument twice.
68
+ Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`.
80
69
 
81
- *Alex Ghiculescu*
70
+ *Sean Doyle*
82
71
 
72
+ * Fix detection of required strict locals.
83
73
 
84
- ## Rails 7.0.0 (December 15, 2021) ##
74
+ Further fix `render @collection` compatibility with strict locals
85
75
 
86
- * Support `include_hidden:` option in calls to
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
- form.file_field :attachments, multiple: true, include_hidden: false
96
- # => <input type="file" multiple="multiple" id="post_attachments" name="post[attachments][]">
97
- ```
79
+ ## Rails 7.1.2 (November 10, 2023) ##
98
80
 
99
- *Sean Doyle*
81
+ * Fix the `number_to_human_size` view helper to correctly work with negative numbers.
100
82
 
101
- * Fix `number_with_precision(raise: true)` always raising even on valid numbers.
83
+ *Earlopain*
102
84
 
103
- *Pedro Moreira*
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
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
89
+ Now they are only passed if the template will actually accept them.
107
90
 
108
- * No changes.
91
+ *Yasha Krasnou*, *Jean Boussier*
109
92
 
93
+ * Fix `@rails/ujs` calling `start()` an extra time when using bundlers
110
94
 
111
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
95
+ *Hartley McGuire*, *Ryunosuke Sato*
112
96
 
113
- * No changes.
97
+ * Fix the `capture` view helper compatibility with HAML and Slim
114
98
 
115
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
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
- * Support `fields model: [@nested, @model]` the same way as `form_with model:
118
- [@nested, @model]`.
102
+ *Jean Boussier*
119
103
 
120
- *Sean Doyle*
121
104
 
122
- * Infer HTTP verb `[method]` from a model or Array with model as the first
123
- argument to `button_to` when combined with a block:
105
+ ## Rails 7.1.1 (October 11, 2023) ##
124
106
 
125
- ```ruby
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
- button_to([ Workshop.find(1), Session.find(1) ]) { "Update" }
133
- #=> <form method="post" action="/workshops/1/sessions/1" class="button_to">
134
- #=> <input type="hidden" name="_method" value="patch" autocomplete="off" />
135
- #=> <button type="submit">Update</button>
136
- #=> </form>
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
- * Support passing a Symbol as the first argument to `FormBuilder#button`:
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
- form.button(:draft, value: true)
145
- # => <button name="post[draft]" value="true" type="submit">Create post</button>
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
- form.button(:draft, value: true) do
148
- content_tag(:strong, "Save as draft")
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
- * Introduce the `field_name` view helper, along with the
158
- `FormBuilder#field_name` counterpart:
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
- form_for @post do |f|
162
- f.field_tag :tag, name: f.field_name(:tag, multiple: true)
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
- *Sean Doyle*
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
- config.action_view.field_error_proc = proc { |html| content_tag(:div, html, class: "field_with_errors") }
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
- * Add support for `button_to ..., authenticity_token: false`
176
+ * Allow opting in/out of `Link preload` headers when calling `stylesheet_link_tag` or `javascript_include_tag`
179
177
 
180
178
  ```ruby
181
- button_to "Create", Post.new, authenticity_token: false
182
- # => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button></form>
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
- button_to "Create", Post.new, authenticity_token: true
185
- # => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button><input type="hidden" name="form_token" value="abc123..." autocomplete="off" /></form>
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
- *Sean Doyle*
186
+ *Alex Ghiculescu*
192
187
 
193
- * Support rendering `<form>` elements _without_ `[action]` attributes by:
188
+ * Stop generating `Link preload` headers once it has reached 1KB.
194
189
 
195
- * `form_with url: false` or `form_with ..., html: { action: false }`
196
- * `form_for ..., url: false` or `form_for ..., html: { action: false }`
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
- *Sean Doyle*
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
- * Add `:day_format` option to `date_select`
196
+ *Jean Boussier*
203
197
 
204
- date_select("article", "written_on", day_format: ->(day) { day.ordinalize })
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
- *Shunichi Ikegami*
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
- * Allow `link_to` helper to infer link name from `Model#to_s` when it
210
- is used with a single argument:
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
- link_to @profile
213
- #=> <a href="/profiles/1">Eileen</a>
212
+ *Andrei Andriichuk*
214
213
 
215
- This assumes the model class implements a `to_s` method like this:
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
- class Profile < ApplicationRecord
218
- # ...
219
- def to_s
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
- Previously you had to supply a second argument even if the `Profile`
225
- model implemented a `#to_s` method that called the `name` method.
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
- link_to @profile, @profile.name
228
- #=> <a href="/profiles/1">Eileen</a>
225
+ *Mike Dalessio*
229
226
 
230
- *Olivier Lacan*
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
- * Support svg unpaired tags for `tag` helper.
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
- tag.svg { tag.use('href' => "#cool-icon") }
235
- # => <svg><use href="#cool-icon"></svg>
235
+ *Mike Dalessio*
236
236
 
237
- *Oleksii Vasyliev*
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
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
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
- * No changes.
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
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
285
+ * Remove deprecated support to passing instance variables as locals to partials.
246
286
 
247
- * Improves the performance of ActionView::Helpers::NumberHelper formatters by avoiding the use of
248
- exceptions as flow control.
287
+ *Rafael Mendonça França*
249
288
 
250
- *Mike Dalessio*
289
+ * Remove deprecated constant `ActionView::Path`.
251
290
 
252
- * `preload_link_tag` properly inserts `as` attributes for files with `image` MIME types, such as JPG or SVG.
291
+ *Rafael Mendonça França*
253
292
 
254
- *Nate Berkopec*
293
+ * Guard `token_list` calls from escaping HTML too often
255
294
 
256
- * Add `weekday_options_for_select` and `weekday_select` helper methods. Also adds `weekday_select` to `FormBuilder`.
295
+ *Sean Doyle*
257
296
 
258
- *Drew Bragg*, *Dana Kashubeck*, *Kasper Timm Hansen*
297
+ * `select` can now be called with a single hash containing options and some HTML options
259
298
 
260
- * 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.
299
+ Previously this would not work as expected:
261
300
 
262
- *Ben Toews*, *John Hawthorn*, *Kasper Timm Hansen*, *Joel Hawksley*
301
+ ```erb
302
+ <%= select :post, :author, authors, required: true %>
303
+ ```
263
304
 
264
- * Add `include_seconds` option for `time_field`.
305
+ Instead you needed to do this:
265
306
 
266
- <%= form.time_field :foo, include_seconds: false %>
267
- # => <input value="16:22" type="time" />
307
+ ```erb
308
+ <%= select :post, :author, authors, {}, required: true %>
309
+ ```
268
310
 
269
- Default includes seconds:
311
+ Now, either form is accepted, for the following HTML attributes: `required`, `multiple`, `size`.
270
312
 
271
- <%= form.time_field :foo %>
272
- # => <input value="16:22:01.440" type="time" />
313
+ *Alex Ghiculescu*
273
314
 
274
- 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.
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
- *Alex Ghiculescu*
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
- * Improve error messages when template file does not exist at absolute filepath.
327
+ *Andrey Samsonov*
279
328
 
280
- *Ted Whang*
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
- * Add `:country_code` option to `sms_to` for consistency with `phone_to`.
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
- *Jonathan Hefner*
337
+ *Chris Gunther*
285
338
 
286
- * OpenSSL constants are now used for Digest computations.
339
+ * `check_box_tag` and `radio_button_tag` now accept `checked` as a keyword argument
287
340
 
288
- *Dirkjan Bussink*
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
- * The `translate` helper now passes `default` values that aren't
291
- translation keys through `I18n.translate` for interpolation.
344
+ ```erb
345
+ = check_box_tag "admin", "1", false
346
+ = check_box_tag "admin", "1", checked: false
292
347
 
293
- *Jonathan Hefner*
348
+ = radio_button_tag 'favorite_color', 'maroon', false
349
+ = radio_button_tag 'favorite_color', 'maroon', checked: false
350
+ ```
294
351
 
295
- * Adds option `extname` to `stylesheet_link_tag` to skip default
296
- `.css` extension appended to the stylesheet path.
352
+ *Alex Ghiculescu*
297
353
 
298
- Before:
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
- stylesheet_link_tag "style.less"
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
- stylesheet_link_tag "style.less", extname: false, skip_pipeline: true, rel: "stylesheet/less"
309
- # <link href="/stylesheets/style.less" rel="stylesheet/less">
376
+ {
377
+ identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
378
+ layout: "layouts/application"
379
+ }
310
380
  ```
311
381
 
312
- *Abhay Nikam*
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
- * Deprecate `render` locals to be assigned to instance variables.
391
+ *Aaron Gough*
315
392
 
316
- *Petrik de Heus*
393
+ * Strip `break_sequence` at the end of `word_wrap`.
317
394
 
318
- * Remove legacy default `media=screen` from `stylesheet_link_tag`.
395
+ This fixes a bug where `word_wrap` didn't properly strip off break sequences that had printable characters.
319
396
 
320
- *André Luis Leal Cardoso Junior*
397
+ For example, compare the outputs of this template:
321
398
 
322
- * Change `ActionView::Helpers::FormBuilder#button` to transform `formmethod`
323
- attributes into `_method="$VERB"` Form Data to enable varied same-form actions:
399
+ ```erb
400
+ # <%= word_wrap("11 22\n33 44", line_width: 2, break_sequence: "\n# ") %>
401
+ ```
324
402
 
325
- <%= form_with model: post, method: :put do %>
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
- *Sean Doyle*
405
+ ```
406
+ # 11
407
+ # 22
408
+ #
409
+ # 33
410
+ # 44
411
+ #
412
+ ```
337
413
 
338
- * Change `ActionView::Helpers::UrlHelper#button_to` to *always* render a
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
- <%= button_to "Delete", post_path(@post), method: :delete %>
343
- # => <form action="/posts/1"><input type="hidden" name="_method" value="delete"><button type="submit">Delete</button></form>
416
+ ```
417
+ # 11
418
+ # 22
419
+ # 33
420
+ # 44
421
+ ```
344
422
 
345
- <%= button_to post_path(@post), method: :delete do %>
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
- *Sean Doyle*, *Dusan Orlovic*
425
+ * Allow templates to set strict `locals`.
351
426
 
352
- * Add `config.action_view.preload_links_header` to allow disabling of
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
- *Andrew White*
429
+ ```erb
430
+ <%# locals: (message:) -%>
431
+ <%= message %>
432
+ ```
357
433
 
358
- * The `translate` helper now resolves `default` values when a `nil` key is
359
- specified, instead of always returning `nil`.
434
+ Default values can also be provided:
360
435
 
361
- *Jonathan Hefner*
436
+ ```erb
437
+ <%# locals: (message: "Hello, world!") -%>
438
+ <%= message %>
439
+ ```
440
+
441
+ Or `locals` can be disabled entirely:
362
442
 
363
- * Add `config.action_view.image_loading` to configure the default value of
364
- the `image_tag` `:loading` option.
443
+ ```erb
444
+ <%# locals: () %>
445
+ ```
365
446
 
366
- By setting `config.action_view.image_loading = "lazy"`, an application can opt in to
367
- lazy loading images sitewide, without changing view code.
447
+ *Joel Hawksley*
368
448
 
369
- *Jonathan Hefner*
449
+ * Add `include_seconds` option for `datetime_local_field`
370
450
 
371
- * `ActionView::Helpers::FormBuilder#id` returns the value
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
- <%= form_for @post do |f| %>
376
- <%# ... %>
453
+ *Wojciech Wnętrzak*
377
454
 
378
- <% content_for :sticky_footer do %>
379
- <%= form.button(form: f.id) %>
380
- <% end %>
381
- <% end %>
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
- * `ActionView::Helpers::FormBuilder#field_id` returns the value generated by
386
- the FormBuilder for the given attribute name.
466
+ * Strings returned from `strip_tags` are correctly tagged `html_safe?`
387
467
 
388
- <%= form_for @post do |f| %>
389
- <%= f.label :title %>
390
- <%= f.text_field :title, aria: { describedby: f.field_id(:title, :error) } %>
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
- *Sean Doyle*
472
+ Fixes [rails/rails-html-sanitizer#124](https://github.com/rails/rails-html-sanitizer/issues/124)
395
473
 
396
- * Add `tag.attributes` to transform a Hash into HTML Attributes, ready to be
397
- interpolated into ERB.
474
+ *Mike Dalessio*
398
475
 
399
- <input <%= tag.attributes(type: :text, aria: { label: "Search" }) %> >
400
- # => <input type="text" aria-label="Search">
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 [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.