2013-04-11 23 views
1

我採取一個多形式 - 如圖#217 Multistep Forms - Railscasts - 和整個錯誤傳來:如何避免保存文件,以會議(多步形式CarrierWave文件)

can't dump File 

這裏是newcreate操作:

def new 
    session[:batch_params] ||= {} 
    @batch = current_user.batches.build 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @batch } 
    end 
end 

def create 
    session[:batch_params].deep_merge!(params[:batch]) if params[:batch] 
    @batch = current_user.batches.build(session[:batch_params]) 

    if @uploaded 
    @batch.file = @uploaded 
    end 

    @batch.current_step = session[:batch_step] 

    if params[:back_button] 
    @batch.previous_step 
    elsif @batch.last_step? 
    @batch.file = session[:file] 
    @batch.save 
    else 
    @batch.next_step 
    end 
    session[:batch_step] = @batch.current_step 

    if @batch.new_record? 
    render 'new' 
    else 
    session[:batch_step] = session[:batch_params] = nil 
    flash[:notice] = "Batch was successfully created" 
    redirect_to @batch 
    end 
end 

的問題是:該文件需要在第一個步驟中更新,因爲我需要閱讀,並得到行數,要在第二個步驟中使用。所以我試圖在會話中存儲文件,並且因爲無法序列化它,所以我收到了這個錯誤。

如何避免這樣做?我相信我應該在第一步上傳文件,然後只是提供它的URL到以下步驟;這是對的嗎?

我該怎麼做?

回答

1

我建議你創建第一個窗體上的記錄,並用狀態機來跟蹤物體的步驟,直到你完全建立它的最後形式。像state_machine這樣的寶石將允許您每步執行驗證。唯一的問題是,你可能會(結束)沒有完成的提交。你可能會定期清理它。

+0

這正是我試圖避免的那種問題。由於'carrierwave'讓我緩存文件的臨時版本,我相信我讀的文件,並提供臨時路徑接下來的步驟直到最後一個人,哪裏會被上傳。這太危險了嗎? – 2013-04-11 20:40:26

+0

嗯,這是臨時的,我不認爲它的生存是有保證的。所有文件上傳保存在一個臨時文件它們存儲在其最終位置之前,你介意指點我到你的行爲描述'carrierwave' – Leito 2013-04-12 04:08:41

+0

你說得對。儘管我不打算讓未答覆的表單持續比會話更長的時間,但該文件可能會過期。然而,'carrierwave'有一個'store'方法,允許我從保存模型的地方上傳文件;所以我相信這是可能保存模型:) http://carrierwave.rubyforge.org/rdoc/classes/CarrierWave/Uploader/Store.html#M000200 – 2013-04-12 12:41:07