我正在使用主动存储来实现表单中的文件上传。
<%= 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
如果验证失败,则重新渲染新页面。如果我已经输入了标题,则先前输入的标题将出现在重新呈现的表单中。但是,如果我已经选择了一个文件,则在重新渲染的表单中不会选择该文件。
我选择一个文件:
提交时,文件已上传,但验证失败,页面重新渲染。该文件不再被选中:
我不太确定这里发生了什么。为什么重新渲染新页面时不记住该文件?为什么表单不显示所选文件?我需要做什么才能确保页面重新呈现时它仍然被选中?
你可以尝试这样的事情:
<%= 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 %>
这是浏览器的常见问题 你可以认为它是 -
文件字段作为单向字段。浏览器到服务器,但不是服务器到 浏览器。
这不是文件字段在任何浏览器中的工作方式。
因此,在编辑页面上,您必须在任何其他位置显式预览
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%>