2016-11-17 53 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

相關問題