首页 > 解决方案 > Rails 5 ActiveStorage:为什么我的表单在重新渲染页面时忘记了选定的文件?

问题描述

我正在使用主动存储来实现表单中的文件上传。

<%= form_for @listing do |form| %>
  # ...
  <%= form.text_field :title, placeholder: "Title" %>
  <%= form.file_field :image, direct_upload: true, accept: "image/png,image/gif,image/jpeg" %>
  # ...
<% end %>

我在控制器中处理表单提交,如下所示:

  def create
    @listing = Listing.new(safe_params)
    if @listing.save
      flash[:success] = "Your posting has been submitted"
      redirect_to root_url
    else
      flash.now[:warning] = @listing.errors.full_messages
      render 'new'
    end
  end

如果验证失败,则重新呈现新页面。如果我已经输入了标题,则之前输入的标题会出现在重新呈现的表单中。但是,如果我已经选择了一个文件,则不会在重新呈现的表单中选择该文件。

我选择一个文件:

文件被选中

提交时,文件已上传,但验证失败并重新呈现页面。该文件不再被选中:

不再选择文件

我不太确定这里发生了什么。为什么重新渲染新页面时不记住文件?为什么表单不显示所选文件?我需要做些什么来确保在页面重新呈现时它仍然被选中?

标签: ruby-on-railsrails-activestorage

解决方案


你可以尝试这样的事情:

<%= form_for @listing do |form| %>
  # ...
  <%= form.text_field :title, placeholder: "Title" %>
  <%= form.hidden_field :image, value: form.object.image.signed_id if form.object.image.attached? %>
  <%= form.file_field :image, direct_upload: true, accept: "image/png,image/gif,image/jpeg" %>
  # ...
<% end %>

推荐阅读