Commit Graph

2817 Commits

Author SHA1 Message Date
Alex Ghiculescu
85b533308f
Document that @rails/ujs is deprecated for button_to (#44100)
* Document that @rails/ujs is deprecated for `button_to`

This was missed in https://github.com/rails/rails/pull/43112

* deprecation needs to go below the examples
2022-01-20 12:23:37 +01:00
Rafael Mendonça França
c777afb242
Merge pull request #44198 from ElMassimo/preload-modules
Ensure preload_link_tag preloads modules correctly
2022-01-19 21:12:26 -05:00
Rafael Mendonça França
b1ac36e305
Remove duplicated response check 2022-01-20 02:10:49 +00:00
Rafael Mendonça França
f708b9f6f0
Merge pull request #44190 from dark-panda/7-0-stable-fix-asset-helpers-for-view-components
Use the safe navigation operator on response.sending?
2022-01-20 02:08:02 +00:00
Maximo Mussini
dd870eef11 Ensure preload_link_tag preloads modules correctly
Prior to this change, preload_link_tag always used rel=preload

This causes the browser to make a request to preload the script, but
for modules scripts the rel does not match the type, so the browser
can not reuse the prefetched script and discards it.

When passing type="module", it should use rel=modulepreload instead.

[0] developer.mozilla.org/en-US/docs/Web/HTML/Preloading_content
[1] developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link
[2] developer.mozilla.org/en-US/docs/Web/HTML/Link_types/modulepreload
[3] developers.google.com/web/updates/2017/12/modulepreload
2022-01-18 18:00:04 -03:00
Nick Rivadeneira
e9c09c4b73
Fix documentation comments for form_tag
The comment break caused a break in documentation
2022-01-11 06:25:40 -05:00
John Hawthorn
94643fde8f Reuse view_context_class when possible
The generated view context classes tend to be fairly complex and use a
lot of memory. Similar to how we only generate new helper classes when
necessary (see https://github.com/rails/rails/pull/40204) we should be
doing the same for view context classes.
2022-01-06 10:23:59 -08:00
Rafael Mendonça França
af4d9def81
Fix documentation output to remove escaping 2022-01-05 20:50:52 +00:00
Ryuta Kamizono
65766ebcc8 Bump license years to 2022 [ci-skip] 2022-01-01 15:22:15 +09:00
soartec-lab
c478b163c6 Fix example codes. The default autocomplete specification is off for helpers that build hidden type input tags. [skip ci] 2021-12-25 11:42:00 +09:00
Rafael Mendonça França
d7e07ea255
Fix #43918 2021-12-20 23:09:14 +00:00
Rafael Mendonça França
dfd28646fe
Merge PR #43157
Add test for #43157

    fix test

    fix #43146

Co-Authered-By: qinmingyuan <mingyuan0715@foxmail.com>
2021-12-20 23:01:53 +00:00
Alex Ghiculescu
da7ff04c69 Fix link_to with a model passed as an argument twice
Fixes https://github.com/rails/rails/issues/43913 which found a regression in https://github.com/rails/rails/pull/42234
2021-12-17 12:24:25 -06:00
Rafael Mendonça França
2a55e3432c
Merge pull request #43886 from seanpdoyle/form-builder-button-method-name-id
Generate `[id]` for `FormBuilder#button` called with method name
2021-12-15 18:12:47 -05:00
Sean Doyle
c6c138ef86 Generate [id] for FormBuilder#button called with method name
Follow-up to [rails/rails#43411][] (merged in [15f6113][])

By default, when generating a `<button>` element through a Form Builder
instance, the element's `[name]` attribute is populated by calling the
`FormBuilder#field_name` method. This commit assigns a matching default
`[id]` attribute generated by `FormBuilder#field_id`.

Additionally, it adds test coverage to ensure that calls that provide
their own `name:` and `id:` options are not overridden by the default
values.

[rails/rails#43411]: https://github.com/rails/rails/pull/43411
[15f6113]: 15f6113622
2021-12-15 17:49:28 -05:00
Alexandru-Emil Lupu
fad2c430ed Fix exception when loading stylesheets in actionmailer templates 2021-12-16 00:42:23 +02:00
Rafael Mendonça França
68f4fbc7cf
Merge pull request #43850 from hachi8833/fix_favicon_link_tag
Remove "shortcut" link type from favicon_link_tag method
2021-12-14 20:37:34 -05:00
Rafael Mendonça França
dae7e46db4
Remove CHANGELOG entry that is already in 7-0-stable 2021-12-15 00:55:18 +00:00
Sean Doyle
4f191b9754 ActiveStorage: support empty attachments submits
The background
---

Configuration for replacing a collection was introduced in
[rails/rails#36716][].

However, since [rails/rails#42596][] has been merged, Rails 7.1 and
beyond will default to _replacing_ an Active Storage `has_many_attached`
relationship, as opposed to _appending to it_.

The problem
---

With replacement as the established precedent, it's currently a
challenge to replace an existing collection with an empty one.

The solution
---

This commit makes two changes.

The first is to Action View and its form building helpers. The change
draws inspiration from how an `<input type="checkbox">` field (or
collection of fields) is paired with an `<input type="hidden">` field to
represent the unchecked value. The change pairs any `<input type="file"
multiple="multiple">` elements with an `<input type="hidden">` element
to represent an empty collection. Like the [check_box][] form builder
method, the `file_field`  method accepts an `include_hidden:` option to
skip the creation of the hidden element.

The second is to how Active Storage generates attribute assignment
methods through `has_many_attached`. With the possibility of an `<input
type="file">` field being paired with an `<input type="hidden"
value="">` field, the backing models need to be able to coerce an
"empty-ish" value into an empty list. For example:

```ruby
@user.highlights = [""]
@user.highlights        # => []
```

When combined, these changes enable consumer applications to submit
"empty" collections to blank out existing attachments.

Support is configured through the
`config.active_storage.multiple_file_field_include_hidden` configuration
value, which defaults to `false`.

[check_box]: https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-check_box
[rails/rails#36716]: https://github.com/rails/rails/pull/36716
[rails/rails#42596]: https://github.com/rails/rails/pull/42596
2021-12-14 18:40:35 -05:00
Sean Doyle
0b8dde0078 FormBuilder#field_id: prepend namespace: option
When constructing the field's `[id]` attribute, the current
`FormBuilder#field_id` implementation (introduced in [59ca21c][])
ignores the `namespace:` option.

This commit incorporates any namespace by prepending it to the
`@object_name`.

[59ca21c]: 59ca21c011

Re-use template.field_id
---

Thread options[:namespace] down through the FormBuilder instance to the
`Tags::Base#tag_id` and `#add_default_name_and_id` methods
2021-12-14 18:00:01 -05:00
Pedro Moreira
3edada28fa
Fix rubocop issue of single- vs double- quotes (+1 squashed commit)
Squashed commits:
[49cb03a3ce] Fix missing return from ActionView::Helpers::NumberHelper#parse_float, fixes #43853
Add test case for number helpers not raising exception when `raise: true` is passed and input is valid
2021-12-13 16:48:53 +00:00
hachi8833
240c1ace76 Remove "shortcut" link type from favicon_link_tag method
Ref: https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types
Ref: https://mathiasbynens.be/notes/rel-shortcut-icon

Update layout.html.erb for Guides

Remove "shortcut" from welcome page
2021-12-13 13:49:43 +09:00
Rafael Mendonça França
7160f46a9e
Merge pull request #43368 from FestaLab/render-hash-syntax
Replaces the hash rocket operator in favor of the newer Ruby syntax on render
2021-12-08 18:13:44 -05:00
Rafael Mendonça França
83d85b2207
Start Rails 7.1 development 2021-12-07 15:52:30 +00:00
Rafael Mendonça França
c2e12e0191
Use to_formatted_s(:db) instead of to_s(:db) internally
Ruby 3.1 introduced an optimization to string interpolation for some
core classes in b08dacfea3.

But since we override `to_s` in some of those core classes to add behavior
like `to_s(:db)`, all Rails applications will not be able to take advantage
of that improvement.

Since we can use the `to_formatted_s` alias for the Rails specific behavior
it is best for us to deprecate the `to_s` core extension and allow Rails
applications to get the proformace improvement.

This commit starts removing all the `to_s(:db)` calls inside the framework
so we can deprecate the core extension in the next commit.
2021-12-06 19:22:04 +00:00
Zhongying Qiao
c92ac83fe6
In #4342, part of the functionalities of form_for was delegated to form_with, this could potentially cause some regress, as the condition to send polymorphic_path(record, {}) instead of polymorphic_path(record, format: options.delete(:format)) is removed and when format is not passed, this causes issues if the caller is not expecting an extra arg format:nil. This PR adds back the condition inside for with and add a test to make sure it doesn't break for_with 2021-12-02 13:29:38 -08:00
Jean Boussier
6dc9e3309f Action View: allow to compile ERB templates with # frozen_string_literal: true
This can save a significant amount of string allocation in some scenarios
and is more consistent with modern Ruby code where `frozen_string_literal`
is enabled most of the time.
2021-11-29 10:38:51 +01:00
Jean Boussier
b4eae47bbe Eliminate internal uses of PerThreadRegistry and deprecate it
This module has been soft deprecated for a long time, but since
it was used internally it wasn't throwing deprecation warnings.

Now we can throw a deprecation warning.
2021-11-22 09:53:16 +01:00
Sean Doyle
4997cc7f86 Implement form_for by delegating to form_with
Improve the parity between `form_for` and `form_with` by implementing
`form_for` in terms of `form_with`.

Replaces `html_options` transformations with coercion of data into the
shape it needs to be in order to delegate to `form_with`.

In the same spirit, this commit also implements `fields_for` in terms of
`fields`.
2021-11-19 16:22:01 -05:00
Sean Doyle
bcb6c359f6 Call #html_options_for_form within form_with
The private [FormTagHelper#html_options_for_form][] helper covers the
same logic as [FormHelper#html_options_for_form_with][].

This commit replaces the re-implementation within `#form_with` with a
call to `#html_options_for_form`. In order to pass along the data in a
correct shape, keep the `#html_options_for_form_with` method and use it
to coerce the options.

[FormTagHelper#html_options_for_form]: fb1ab3460a/actionview/lib/action_view/helpers/form_tag_helper.rb (L873-L894)
[FormHelper#html_options_for_form_with]: fb1ab3460a/actionview/lib/action_view/helpers/form_helper.rb (L1552-L1579)
2021-11-19 11:37:51 -05:00
Rafael Mendonça França
884c97fad0
Remove deprecated support concat errors to ActiveModel::Errors#messages 2021-11-17 21:51:25 +00:00
Rafael Mendonça França
d4ad739454
Remove deprecated Rails.config.action_view.raise_on_missing_translations 2021-11-17 21:51:16 +00:00
Rafael Mendonça França
1a06f5dc09
Fix typo in the documentation 2021-11-15 23:24:00 +00:00
Rafael Mendonça França
41e41360bb
Remove code duplication by extracting the _object_for_form_builder private method 2021-11-15 23:23:44 +00:00
Rafael Mendonça França
846f9e9595
Merge PR #43416 2021-11-15 22:55:37 +00:00
Rafael Mendonça França
033822117b
Merge PR #43413 2021-11-15 22:35:01 +00:00
Rafael Mendonça França
39a25ba57e
Fix typo in the documentation
Fixes #43651
2021-11-15 22:26:22 +00:00
Sean Doyle
15f6113622 Support name Symbol to FormBuilder#button
Since `<button>` elements translate their `[name]` and `[value]`
attributes to the resulting `<form>` element submission, and are encoded
into the resulting `URLSearchParams` or `FormData` instance, Action View
`FormBuilder` instances should support encoding a method name the same
way it does for other fields.

For instance, consider this HTML:

```html
<button>Publish</button>
<button name="post[draft]" value="true">Save as draft</button>
```

Clicking the "Publish" button would submit the form without encoding any
additional `[name]` and `[value]` pairs.

Clicking the "Save as draft" button would submit the form and encode
`post[draft]=true` into the submission.

This commit changes the `FormBuilder#button` method to interpret a
`Symbol` as the first argument as a method name argument, and encodes
its value based on the form's `model:` or `scope:` value:

```erb
<%= form.button :draft, value: true do %>
  Save as draft
<% end %>
end
<%# =>  <button name="post[draft]" value="true" type="submit">  %>
<%#       Save as draft                                         %>
<%#     </button>                                               %>
```

Co-authored-by: Rafael Mendonça França <rafael@rubyonrails.org>
2021-11-15 21:40:06 +00:00
Rafael Mendonça França
876d2ff904
Merge PR #43409 2021-11-15 21:20:34 +00:00
Rafael Mendonça França
27d24e9caa
Merge PR #42755 2021-11-15 21:11:59 +00:00
Rafael Mendonça França
1fde031e89 Fix gemspec 2021-11-15 21:06:21 +00:00
Rafael Mendonça França
9195b7fd0a
Require MFA to release rails 2021-11-15 20:37:42 +00:00
Ryuta Kamizono
26e89c7f95 Add missing # [ci skip] 2021-11-15 14:23:12 +09:00
Ryuta Kamizono
ab60159bc2 Fix broken rdoc for form_with [ci skip] 2021-11-15 14:08:36 +09:00
Gannon McGibbon
fb36712781
Merge pull request #38957 from DmitryTsepelev/store-per-attachment-direct-upload
Pass service_name param to DirectUploadsController
2021-11-15 00:06:17 -05:00
Guillermo Iguaran
b667e48b22
Merge branch 'main' into button-to-authenticity-token 2021-11-14 11:36:48 -08:00
Guillermo Iguaran
e0076e4c68
Merge pull request #42051 from seanpdoyle/form-empty-action
Support `<form>` elements without `[action]`
2021-11-14 11:29:29 -08:00
DmitryTsepelev
193289dbbe Support direct uploads to multiple services 2021-11-14 11:49:06 +03:00
Sean Doyle
4765698951 Document tag.attributes helper
The `tag.attributes` helper introduced in [#40657][] is implemented on a
`:nodoc:`-private `TagBuilder` class, so the documentation for the
method is omitted when generating the API Guides HTML pages.

This commit extends the `ActionView::Helpers::TagHelper` module
documentation comment to mention the new attribute building
capabilities, along with some examples.

[#40657]: https://github.com/rails/rails/pull/40657
2021-11-09 12:13:19 -05:00
Sean Doyle
3dae4469af Support <form> elements without [action]
Some background
---

By default, when a `<form>` is declared without an `[action]` attribute,
browsers will encode a `<form>`'s fields into the _current_ URL.

This can be useful for a `<form method="get">` that operates on the
current page. For example, when filtering search results, a form that
sorts:

```html
<form method="get">
  <button name="sort" value="desc">Most to least</button>
  <button name="sort" value="asc">Least to most</button>
</form>
```

can operate on a page that is filtered in another way by merging the
`?sort=asc` or `?sort=desc` values _into_ the existing page, which might
have the `?q=...` string set elsewhere.

The problem
---

Prior to this commit, none of the `<form>` construction variations
supported declaring a `<form>` without an `[action]` attribute.
`form_with`, `form_for`, and `form_tag` all default to `url_for({})`
when a `url:` or `action:` option is omitted.

The solution
---

Treat `url: false`, or `action: false` as an escape hatch to signal to
Action View that we don't need to transform the `model:` option or
argument into a Rails route.

Similarly, when calling `button_to` with `false` as the URL options
arguments will construct a `<form>` element without an `[action]`
attribute.
2021-10-29 10:08:47 -04:00