Rails 5 ActiveStorage:为什么我的表单在重新渲染页面时会忘记所选文件?

问题描述 投票:0回答:2

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

<%= 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-rails rails-activestorage
2个回答
1
投票

你可以尝试这样的事情:

<%= 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 %>

0
投票

这是浏览器的常见问题 你可以认为它是 -

文件字段作为单向字段。浏览器到服务器,但不是服务器到 浏览器。

这不是文件字段在任何浏览器中的工作方式。

因此,在编辑页面上,您必须在任何其他位置显式预览

file
file name
,只是为了让用户知道已经存在一个文件,除非他想用另一个文件更新该文件。

<%= form_for @listing do |form| %>
   #...
    <div>
      <%if form.object.image.present?%>
        #name of file
      <%end%>
    </div>
    <%= form.file_field :image, direct_upload: true, accept: "image/png,image/gif,image/jpeg" %>
    #..
<%end%>
© www.soinside.com 2019 - 2024. All rights reserved.