如何避免将文件保存到会话(使用CarrierWave文件的多步骤表单)

时间:2013-04-11 19:07:37

标签: ruby-on-rails ruby carrierwave

我正在实施一个多步骤表单 - 如#217 Multistep Forms - Railscasts所示 - 并遇到错误:

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

问题是:文件需要在第一步中更新,因为我需要读取它并获取行数,以便在第二步中使用。所以我试图在会话中存储一个文件,因为它不可能序列化它,我收到了这个错误。

怎么可以避免这样做?我相信我应该在第一步上传文件,然后只提供以下步骤的网址;这是对的吗?

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我建议您在第一个表单上创建记录,并使用状态机跟踪对象的步骤,直到在最后一个表单上完全构建它为止。像state_machine这样的宝石将允许您按步骤进行验证。唯一的问题是你可能(将)以未完成的提交结束。你可以定期清理它。