Skip to content
  • Sean Doyle's avatar
    4f191b97
    ActiveStorage: support empty attachments submits · 4f191b97
    Sean Doyle authored
    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
    4f191b97
    ActiveStorage: support empty attachments submits
    Sean Doyle authored
    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
Loading