2

我有一個多步驟的形式靈感來自railcast有3個文件上傳圖像。但是,當我上傳圖像時,我收到錯誤can't dump File回形針和文件上傳問題

在其他問題使我明白,在會話保存文件上傳不工作,所以我需要OT使用這樣的事情:

unless @post.valid? 
     @post.assets.first.attachment.clear 
     @post.assets.first.attachment.queued_for_write.clear 
    end 

然而,這似乎並沒有工作。我應該通過三個文件上傳並每次清除它們嗎?我怎樣才能避免這個錯誤?

這裏是我的創造功能:

session[:post_params].deep_merge!(params[:post]) if params[:post] 
    session[:duration] = params[:post_duration] if params[:post_duration] 


    @post = Post.new(session[:post_params]) 
    @post.current_step = session[:post_step] 

    unless @post.valid? 
     logger.info("attachment " + @post.assets.first.attachment.inspect) 
     @post.assets.first.attachment.clear 
     @post.assets.first.attachment.queued_for_write.clear 
    end 


    if @post.valid? 
     if params[:back_button] 
     @post.previous_step 
     elsif @post.last_step? 
     if @post.all_valid? 
      ... 
      session[:post_step] = session[:post_params] = nil 
      redirect_to @post and return 
     end 
     else 
     @post.next_step 
     end 

    session[:post_step] = @post.current_step 
    end 

    if @post.new_record? 
     render "new" 
    end 
    end 

我的資產模型

class Asset < ActiveRecord::Base 
    # attr_accessible :title, :body 

belongs_to :post 
attr_accessible :attachment 
has_attached_file :attachment, :styles => { :medium => "600x600>", :small => "200x200>", :thumb => "100x100>" }, 
:default_url => "no_image_:style.jpg" 
end 
+0

我對此沒有太多的經驗,所以你可以從這個[StackOverflow post]獲得一些見解(http://stackoverflow.com/questions/5876714/multi-step-form-in -rails-3-with-paperclip-attachments/8079113#8079113) –

+0

@RichPeck這確實是我發現的建議,用於清除圖像對象 – Ayrad

+0

它可以幫助http://stackoverflow.com/questions/7079999/paperclipnotidentifiedbyimagemagickerror-image -is-not-recognized-the-ident/16933264#16933264 – Nithin

回答

1

的問題是,你不能一個File存儲到會話對象,因爲它必須是Marshal ED,這是不支持。當我看到它,你有三種可能的解決方案:

  1. 最簡單的辦法,這一切都在最後一步的你嚮導添加圖片上傳部分。這樣你就不需要將最後一部分信息保存在會話中,而是直接保存在對象中。只要確保你跳過會話保存在最後一步或者你把文件PARAMS他們的東西存放到您的會話像

    params[:post].except(:assets) 
    
  2. 之前,第二個解決方案是非常棘手。你可以做的是每當你的控制器試圖保存一個模型時,你將附件保存在一個已知名稱的磁盤上。現在,不是將文件存儲到會話中,而是存儲剛剛創建的本地文件名(您仍然需要類似except以避免該例外)。保存後,您將基本上恢復會話參數中指定的服務器磁盤中的文件。爲了保持乾淨,你需要一個可以刪除舊文件的cron作業(例如一週前保存的任何文件)。你可以使用whenever

    提示:如果選擇上述溶液中,你的附件是一個獨立的模型,因爲它似乎,實際上你可以保存「TEMP」資產沒有關聯post_id。然後,而不是文件名,您將處理唯一的數據庫ID;)

  3. 最後,如果您的業務邏輯(和您的神經)允許它,您可以考慮在每一步持續您的模型在數據庫中,它被部分保存。這樣你就不需要使用會話,但是你將不得不處理很多條件(在你的驗證中,在你的範圍內,在你的關聯中......),當然你仍然需要這個cron工作。

+0

好的建議。我希望解決方案1能夠工作,但是在最後一步(付款)上傳圖片並不合乎邏輯。我正在調查解決方案2,因爲我使用的是heroku,所以這可能會很複雜。 – Ayrad

+0

我想你可能會混淆模型的使用和多步驟的形式。您無需將所有表單步驟與一個模型進行匹配。我不確定你的業務邏輯是什麼,但是通過前幾個步驟創建一個模型也是有意義的,在最後一步你只需傳遞創建的對象'id'的引用並生成一個不同的模型與另一個關聯。不知道這是否明確:) – Nikos

+0

我確實有點困惑。你能澄清嗎?它看起來像圖像上傳到一個名爲assets_attributes的參數,所以我將它從會話中刪除,如下所示:session [:post_params] .deep_merge!(params [:listing] .except(:assets_attributes))if params [:post]。如何分別保存資源(上傳的圖像)並在最後一步將其添加到帖子中? – Ayrad