回形针验证在Rails 3中导致错误

时间:2011-08-17 04:30:23

标签: ruby-on-rails paperclip dump image-uploading paperclip-validation

我最近在我的Rails 3应用程序中安装了paperclip gem。我正在尝试允许用户将头像上传到他们的个人资料。我按照安装说明操作,这是我的模型/视图的样子:

我的'user.rb'模型具有以下代码:

has_attached_file :avatar, 
                  :styles => { :small => "70x70>"},
                  :url  => "/users/:attachment/:id/:style/:basename.:extension",
                  :path => ":rails_root/public/users/:attachment/:id/:style/:basename.:extension"

validates_attachment_size :avatar, :less_than => 1.megabytes
validates_attachment_content_type :avatar, :content_type => ['image/jpeg', 'image/png']

我已将以下内容添加到编辑表单html(我正在使用HAML顺便说一句):

= form_for (@user || User.new), :html => { :multipart => true } do |f|
...
.profile_picture.text_field
  = image_tag current_profile.avatar.url(:small)
  %br
  = f.file_field :avatar

当我上传1mb以下的图片(jpeg或png)时,一切顺利;图像上传,没有错误。如果我尝试上传任何其他类型的文件(MP3,txt,等等)或文件/图像大于1mb rails会给我以下错误:

TypeError in UsersController#update

can't dump File

Request

Parameters:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"LaiYjEEfgsE8JzzLsfkzk6TK8D4uxzIo5ASlu6ax2rY=",
 "user"=>{"avatar"=>#<ActionDispatch::Http::UploadedFile:0x000001053f0bf0 @original_filename="GT1_22HS_1_std.jpg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"user[avatar]\"; filename=\"GT1_22HS_1_std.jpg\"\r\nContent-Type: image/jpeg\r\n",
 @tempfile=#<File:/var/folders/Ud/Udv4OlryEzWrHedR8pIe1E+++TI/-Tmp-/RackMultipart20110817-17075-1ikqcc0>>,
 "first_name"=>"First",
 "last_name"=>"Last",
 "country"=>"United States",
 "state"=>"California",
 "city"=>"City",
 "date_of_birth(1i)"=>"2011",
 "date_of_birth(2i)"=>"7",
 "date_of_birth(3i)"=>"12",
 "account_attributes"=>{"email"=>"email@email.com",
 "id"=>"6",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]"},
 "commit"=>"Save & Continue",
 "id"=>"2"}

如果所有这些都不是必需的,我很抱歉,但错误有点不具描述性,所以我认为最好发帖以防万一。

我想知道我的验证错误是没有生成错误,应用程序正在破坏。任何有关此事的帮助将不胜感激。我真诚地感谢所有花时间阅读本文的人,非常感谢任何帮助!谢谢!

更新:

update method form user_controller.rb:

  def update
    session[:user_params] ||= {}
    session[:user_params].deep_merge!(params[:user]) if params[:user].present?

    @user.attributes = session[:user_params]

    respond_to do |format|
      if @user.save
        session[:user_params] = nil
        sign_in(@user.account, :bypass => true)
        format.html { redirect_to(root_url, :notice => 'User was successfully updated.') }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "edit", :layout => "userhome" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

3 个答案:

答案 0 :(得分:2)

can't dump File是Ruby在被要求使用File转储Marshal.dump对象时引发的错误。

Marshal.dump(File.new(".gemrc")) # => TypeError: can't dump File

所以问题可能在于验证失败时你所做的事情。如果您将params(包含File对象)放在sessionflash对象(由Rails转储)中,这就是您的问题。

答案 1 :(得分:0)

你试过吗

@user.attachment.destroy

在您的回复中分配 @ user.errors 之前?

答案 2 :(得分:0)

我的问题是,使用Attachment#clear清除回形针附件是不够的,因为它仍然想保存一些File

我发现问题出在Attachment中仍然包含数据的@queued_for_write属性。

所以以下两行解决了我的问题:

unless @model.valid?
  @model.image.clear
  @model.image.queued_for_write.clear
end

这是一个回形针错误,已在this commit中更正。