带图像上传器的多步形式

Alp*_*haB 6 ruby ruby-on-rails ruby-on-rails-3 carrierwave

我想在第二步用头像上传建立3步用户注册.所以我按照Ryan Bates的指南http://railscasts.com/episodes/217-multistep-forms.我正在使用CarrierWave gem来处理上传.但似乎我无法在用户会话中存储上传的文件信息(我得到无法转储文件错误).我在控制器中使用以下技术

if params[:user][:img_path]
  @uploader = FirmImgUploader.new
  @uploader.store!(params[:user][:img_path])
  session[:img] = @uploader
  params[:user].delete(:img_path)
end
Run Code Online (Sandbox Code Playgroud)

它确实有帮助.但是当我上传禁止的文件类型时,这一行上的所有内容都会崩溃

@uploader.store!(params[:user][:img_path])
Run Code Online (Sandbox Code Playgroud)

有这个错误

CarrierWave::IntegrityError in UsersController#create
You are not allowed to upload "docx" files, allowed types: ["jpg", "jpeg", "gif", "png"]
Run Code Online (Sandbox Code Playgroud)

而不是正常的表单验证错误.

我怎么解决这个问题 ?谢谢 !

Alp*_*haB 3

事实上我解决了我的问题。这是使用 Carrierwave 上传文件的多步表单的工作代码

if params[:user][:img_path]
  @uploaded = params[:user][:img_path]
  params[:user].delete(:img_path)
end
session[:user_data].deep_merge!(params[:user]) if params[:user]
@user = User.new(session[:user_data])    

if @uploaded
  # here how validation will work
  @user.img_path = @uploaded
end
@user.current_stage = session[:register_stage]
if @user.valid?
  if @user.last_stage?
    @user.img_path  = session[:img] if @user.last_stage?
    @user.save
  else  
    @user.next_stage
  end
  # now we can store carrierwave object in session
  session[:img] = @user.img_path
  session[:register_stage] = @user.current_stage
end
Run Code Online (Sandbox Code Playgroud)