2016-11-17 25 views
1

我有一个Profile模型:当文件存在时,如何更改simple_form中文件字段的名称?

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,我希望它显示一个文件字段,该文件字段具有附加文件的名称 - 这样,如果他们想要更改附加的文件,则只需单击上传即可,并且它将更新该文本记录。

我有实际的更新操作现在的工作,但发生的事情是,它只是显示这样的字段:

enter image description here

其中顶部file_field是现有的文件,而下面的反映可以添加的新字段。

+0

作为答案之一说,它不能做到。它是一个安全问题。你将不得不寻找另一种方式来满足你的要求。 – DickieBoy

+0

如果您要使用像carrierwave这样的东西来处理上传,它将允许您执行一些操作,因为它可以保留文件名等。这或者可以重写。不幸的是,当你发现你不希望你的浏览器能够超越某个特定点来改变文件系统上的文件,所以这是一个安全问题。话虽如此......一旦你在控制器方法中有上传的文件二进制数据。在坚持它之前,你可以在这一点上任意指定它。因此,一旦数据被保存,您就可以在Rails的一侧进行操作。 – engineerDave

回答

1

_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 %> 
+0

所以这部分让我在那里。我想真正的问题是,如何在'f.object.persisted?'时使用文件名填写'file_field'的名称? – marcamillion

+1

我不认为你想使用'file_field'作为一个已经上传的文件。只需在span/div中显示文件名即可。 – zwippie

5

你不能。

设置文件输入值的唯一方法是当用户从他的系统中选择一个文件。如果你会强制执行它,它会在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. 一个复选框,选中时删除当前上传的文件。请注意,无法上传“空”文件,因此您需要这样的内容来清除该字段的值。

希望我回答了你的问题。

+0

有点....但问题是,我已经看到文件字段有附加文件的名称...所以我想知道他们是如何做到的。 – marcamillion

相关问题