Commit Graph

2813 Commits

Author SHA1 Message Date
Juan Guecaimburu
bd0753b396 Add support to locales with lowdash in Resolver::PathParser
In previous versions of Rails, a dynamic regex was built to find templates.
After that, PathParser started to be used to both match and sort templates.
With the dynamic regex, templates with lowdash locales (es_AR) were
found properly. But the PathParser regex does not match locales with this
format, only allowing dash (es-AR) or no dash (es). Templates with lowdash
locales have a wrong virtual path and get filtered.

In this commit the PathParser regex is extended to support the lowdash.
2022-01-14 15:11:58 -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
Sean Doyle
9c86593caa Execute field_error_proc within view
Instead of treating it as an anonymous block, execute the
`ActionView::Base.field_error_proc` within the context of the
`ActionView::Base` instance.

This enables consumer applications to continue to override the proc as
they see fit, but frees them from declaring templating logic within a
`config/initializers/*.rb`, `config/environments/*.rb` or
`config/application.rb` file.

This makes it possible to replace something like:

```ruby
config.action_view.field_error_proc = proc do |html_tag, instance|
  <<~HTML.html_safe
    #{html_tag}
    <span class="errors">#{instance.error_message.to_sentence}</span>
  HTML
end
```

With inline calls to Action View helpers like:

```ruby
config.action_view.field_error_proc = proc do |html_tag, instance|
  safe_join [ html_tag, tag.span(instance.error_message.to_sentence, class: "errors") ]
end
```

Or with a view partial rendering, like:

```ruby
config.action_view.field_error_proc = proc do |html_tag, instance|
  render partial: "application/field_with_errors", locals: { html_tag: html_tag, instance: instance }
end
```

Then, elsewhere in `app/views/application/field_with_errors.html.erb`:

```erb
<%= html_tag %>
<span class="errors"><%= instance.error_message.to_sentence %></span>
```
2021-10-29 10:07:04 -04:00
Sean Doyle
71fb8eb833 button_to: Support authenticity_token: option
Match support for passing `authenticity_token:` in `form_with` and
`form_for` calls.

```ruby
button_to "Create", Post.new, authenticity_token: false
  # => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button></form>

button_to "Create", Post.new, authenticity_token: true
  # => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button><input type="hidden" name="form_token" value="abc123..." autocomplete="off" /></form>

button_to "Create", Post.new, authenticity_token: "secret"
  # => <form class="button_to" method="post" action="/posts"><button type="submit">Create</button><input type="hidden" name="form_token" value="secret" autocomplete="off" /></form>
```
2021-10-29 10:02:22 -04:00
Sean Doyle
46175a036a Action View: Support fields model: [...]
Support `fields model: [@nested, @model]` the same way as `form_with
model: [@nested, @model]`.

After this change, the `fields` helper matches the precedent established
by [fields_for][], [form_for][], and [form_with][].

[fields_for]: 5e1a039a1d/actionview/lib/action_view/helpers/form_helper.rb (L2235)
[form_with]: 5e1a039a1d/actionview/lib/action_view/helpers/form_helper.rb (L749)
[form_for]: 5e1a039a1d/actionview/lib/action_view/helpers/form_helper.rb (L436)
2021-10-29 10:01:51 -04:00
Sean Doyle
7d2be2e011 Make button_to more model-aware
Infer HTTP verb `[method]` from a model or Array with model as the first
argument to `button_to` when combined with a block:

```ruby
button_to(Workshop.find(1)){ "Update" }
  #=> <form method="post" action="/workshops/1" class="button_to">
  #=>   <input type="hidden" name="_method" value="patch" autocomplete="off" />
  #=>   <button type="submit">Update</button>
  #=> </form>

button_to([ Workshop.find(1), Session.find(1) ]) { "Update" }
  #=> <form method="post" action="/workshops/1/sessions/1" class="button_to">
  #=>   <input type="hidden" name="_method" value="patch" autocomplete="off" />
  #=>   <button type="submit">Update</button>
  #=> </form>
```

Prior to this change, the constructed `<form>` was always submitted with
a `[method="post"]` and _always_ omitted the `<input type="hidden"
name="_method" value="...">` field, regardless of the return value of
the "model" argument's `#persisted?` predicate.
2021-10-29 10:01:20 -04:00