【问题标题】:How do I change the name of the file field in simple_form when a file exists?当文件存在时,如何更改 simple_form 中文件字段的名称?
【发布时间】:2016-11-17 09:07:24
【问题描述】:

我有一个Profile 模型:

  has_many :transcripts, dependent: :destroy
  accepts_nested_attributes_for :transcripts, allow_destroy: true

所以在我的app/views/profiles/_form.html.erb 上,我有以下内容:

      <%= f.simple_fields_for :transcripts do |transcript| %>
        <%= render 'transcript_fields', f: transcript %>
      <% end %>

app/views/profiles/_transcript_fields.html.erb 看起来像这样:

<%= f.file_field :attachment, class: 'col-lg-4 form-control' %>

所以我想做的是在_transcript_fields 部分,当profile 有现有的transcripts 时,我希望它显示一个附加文件名的文件字段——如果他们这样做想要更改附加的文件,他们只需单击同一 file_field 上的上传,它就会更新该成绩单记录。

我现在可以进行实际的更新操作,但实际情况是,它只显示如下字段:

其中最上面的file_field 是现有文件,下面是一个可以添加的新字段。

【问题讨论】:

  • 正如其中一个答案所说,它无法完成。它是一个安全问题。您将不得不找到另一种方法来满足您的要求。
  • 如果您要使用carrierwave之类的东西来处理上传,它将允许您执行其中的一些操作,因为它可以保留文件名等。这个或者可能是重新文件。不幸的是,正如您发现的那样,您不希望您的浏览器能够对文件系统上的文件进行变异超过某个点,因此这是您遇到的安全问题。话虽如此......一旦你在控制器方法中上传了文件二进制数据。在持久化之前,您可以随意命名它。因此,一旦数据被持久化,您就可以在 Rails 端进行操作。

标签: ruby-on-rails simple-form ruby-on-rails-5


【解决方案1】:

你不能。

设置文件输入值的唯一方法是当用户从他的系统中选择一个文件时。如果你强行这样做,它将在 HTML 中显示为这样。

<form name="foo" method="post" enctype="multipart/form-data">
  <input type="file" value="c:/rails.png">
</form>

这样做是出于安全原因。否则,您将能够创建一个自动从客户端计算机上传特定文件的 Javascript,但如果您想对上传的文件字段进行一些编辑功能,您可能想要做的是:

  1. 仅通过打印文件名或 URL、可点击的下载链接或图像来显示此字段的当前值:仅显示它,可能是缩略图。
  2. 用于上传新文件的 file_field。
  3. 一个复选框,选中后会删除当前上传的文件。请注意,无法上传“空”文件,因此您需要这样的东西来清除字段的值。

希望我回答了你的问题。

【讨论】:

  • Kinda....但问题是我看到文件字段具有附件的名称...所以我想知道他们是如何做到的。
【解决方案2】:

_transcript_fields 部分中,您可以检查当前的transcript 对象是否已经持久化。基于此,可以呈现不同的东西。

类似:

# app/views/profiles/_transcript_fields.html.erb
<% if f.object.persisted? %>
  <%= f.object.name %>
<% else %>
  <%= f.file_field :attachment, class: 'col-lg-4 form-control' %>
<% end %>

【讨论】:

  • 所以这部分让我到了那里。我想真正的问题是,我如何在file_field的名称中填写文件名,当f.object.persisted?
  • 我认为您不想对已上传的文件使用file_field。只需在 span/div 中显示文件名就足够了。
猜你喜欢
  • 2012-03-02
  • 2017-05-29
  • 1970-01-01
  • 2012-04-29
  • 2019-10-21
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多