проверки скрепки, вызывающие ошибку в Rails 3 - PullRequest
3 голосов
/ 17 августа 2011

Я недавно установил гем paperclip в свое приложение Rails 3. Я пытаюсь разрешить пользователям загружать аватар в свой профиль. Я следовал инструкциям по установке и вот как выглядят мои модели / виды:

Моя модель '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

Когда я загружаю картинку (jpeg или png) размером менее 1 Мб, все работает плавно; изображение загружено, и ошибок нет. Если я пытаюсь загрузить любой другой тип файла (MP3, txt и т. Д.) Или файл / изображение больше 1 МБ рельсов, я получаю следующую ошибку:

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:

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 ]

2 голосов
/ 20 августа 2011

can't dump File - это ошибка, которую Ruby вызывает, когда его просят вывести объект File, используя Marshal.dump.

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

Таким образом, проблема, вероятно, заключается в том, что вы делаете, когда проверка не пройдена. Если вы помещаете params (который содержит объект File) в session или flash объекты (которые сбрасываются Rails), это ваша проблема.

0 голосов
/ 10 ноября 2011

Проблема в моем случае в том, что очистки скрепки с помощью Attachment#clear было недостаточно, потому что она все еще хотела сэкономить File.

Я обнаружил, что проблема была в атрибуте @queued_for_write в Attachment, который все еще содержал данные.

Итак, следующие две строки решили мою проблему:

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

Это была ошибка скрепки и была исправлена ​​в этом коммите .

0 голосов
/ 27 сентября 2011

Вы пробовали

@user.attachment.destroy

до назначения @user.errors в вашем ответе?

...