2012-03-20 29 views
6

我有一個最初使用Paperclip進行文件上傳的rails應用程序,但是,正如我看到CarrierWave顯然具有通過重新顯示形式的「持久上傳」類型功能,我決定試一試。CarrierWave在表單重新顯示後沒有保存上傳

在我看來,我有以下幾點:

= f.input :attachment 
= f.hidden_field :attachment_cache 

如果表單驗證失敗而被重新顯示哪個正確緩存文件,但是當我糾正驗證錯誤並重新提交,附件不被處理。

Started POST "/section/model" for 127.0.0.1 at 2012-03-20 08:51:56 +0000 
    Processing by Client::WishesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"zkdPQBsAnsNzx555rkwZ5+clfnLaXg+NtL+GdFei188=", "model"=>{"title"=>"Sample", "content"=>"Sample content", "contact_name"=>"Mr Sample", "contact_email"=>"[email protected]", "attachment_cache"=>"20120320-0851-42559-1644/SampleAttachment.pdf"}, "commit"=>"Create Wish"} 
    Client Load (0.3ms) SELECT `clients`.* FROM `clients` WHERE `clients`.`id` = 1 LIMIT 1 
    (0.2ms) BEGIN 
    SQL (0.4ms) INSERT INTO `models` (`attachment`, `client_id`, `contact_email`, `contact_name`, `content`, `created_at`, `status`, `title`, `updated_at`, `upload_content_type`, `upload_file_name`, `upload_file_size`, `upload_updated_at`) VALUES (NULL, 1, '[email protected]', 'Mr Sample', 'Sample content', '2012-03-20 08:51:56', 'Unresolved', 'Sample', '2012-03-20 08:51:56', NULL, NULL, NULL, NULL) 

這似乎通過在PARAMS的attachment_cache被正確地傳遞附件,但它不然後保存,因爲它不具有PARAMS附件[:模型] [:附件]字段。

它沒有在carrierwave部分中提出任何進一步的步驟,以使上傳在CarrierWave GitHub上的表單重新顯示中工作。

+0

它的工作原理如果我創建/更新與質量賦值,並設置單獨的變量,但我想知道是否有辦法做到這一點沒有質量分配? – HaaR 2012-03-20 11:03:49

+0

考慮[打開票](https://github.com/jnicklas/carrierwave/issues)。 – 2012-03-20 20:45:13

+1

你找到了答案嗎? – user749798 2013-05-08 01:10:55

回答

3

嘗試填充avatar_cache的值,以便在驗證失敗時,它會在形式的預先填充:

= f.hidden_field :attachment_cache, :value => @model.attachment_cache 

哪裏@model是型號名稱

這似乎爲工作我在多次重新加載同一表單時(即多次驗證失敗時)。我認爲他們從文檔中排除了這一點。

+0

這不適用於嵌套形式 – Francisco 2016-05-16 20:52:59

+0

這對我來說不起作用(Rails 4.2.5)。 – fatuhoku 2016-09-26 16:10:05

+0

您還必須將字段名稱添加到強參數 – 2017-04-16 05:33:29

0

原因是'改變了?'檢查,當驗證錯誤時,我們將緩存文件傳遞到不是數據庫表列的#{model} _cache字段,因此它不保存對象,因爲在AR的觀點上沒有任何更改。

我做了一個黑客通過建立模型的方法,包含的文件,使這項工作: 「數據」是列名

def data_cache=(text) 
    @changed_attributes.merge!("data" => nil) 
    super 
end 

希望這有助於。

+0

我編輯了此答案以刪除背景故事。答案應該回答這個問題,不要包含無關的信息。隨時查看我的更改,並歡迎來到StackOverflow! – BradleyDotNET 2014-03-25 19:52:37

0

對我來說,問題是,我不得不

accepts_nested_attributes_for :avatars, allow_destroy: true, reject_if: lambda { |avatar| avatar[:file].blank? } 

所以我拒絕該文件,因爲文件是不存在

注意的是,文件本身並沒有堅持這一點很重要,但只是文件緩存。這就是爲什麼carrierwave docs建議:

這可能是一個好主意,顯示一個文件已被上傳,在圖像的情況下,用戶,小縮略圖會是一個很好的指標:

1

這是一個有點老問題,但它爲我工作後,我加入了強大的參數給控制器,就像這樣:

#controller 
def object_params 
    params.require(:object).permit(:attachment, :attachment_cache) 
end 

#view 
<%= f.file_field :attachment %> 
<%= f.hidden_field :attachment_cache %> 
1

這將解決您的問題100%

請看看

accepts_nested_attributes_for :avatars, allow_destroy: true, 
reject_if: lambda { |avatar| avatar[:avatar].blank? and avatar[:avatar_cache].blank?} 

在這裏,我們將拒絕當兩個avatar[:avatar]avatar[:avatar_cache]是空白

0

要添加到@馬爾科的回答頭像:

如果您用的是Active管理員,你」需要將緩存的文件添加到permit_params行。

permit_params: :title, :file, :file_cache 
相關問題