Скрепка: удалите вложение и ошибка «невозможно преобразовать ноль в строку» - PullRequest
4 голосов
/ 26 апреля 2010

Я использую Paperclip и вот что я делаю в модели, чтобы удалить вложения:

  def before_save
    self.avatar = nil if @delete_avatar == 1.to_s 
  end

Работает нормально, если не установлен флаг @delete_avatar, когда пользователь на самом деле загружает изображение (поэтому модель получает и params[:user][:avatar], и params[:user][:delete_avatar]. Это приводит к следующей ошибке:

TypeError: can't convert nil into String
    from /Work/project/src/vendor/plugins/paperclip/lib/paperclip/storage.rb:40:in `dirname'
    from /Work/project/src/vendor/plugins/paperclip/lib/paperclip/storage.rb:40:in `flush_writes'
    from /Work/project/src/vendor/plugins/paperclip/lib/paperclip/storage.rb:38:in `each'
    from /Work/project/src/vendor/plugins/paperclip/lib/paperclip/storage.rb:38:in `flush_writes'
    from /Work/project/src/vendor/plugins/paperclip/lib/paperclip/attachment.rb:144:in `save'
    from /Work/project/src/vendor/plugins/paperclip/lib/paperclip/attachment.rb:162:in `destroy'
    from /Work/project/src/app/models/user.rb:72:in `before_save'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/callbacks.rb:347:in `send'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/callbacks.rb:347:in `callback'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/callbacks.rb:249:in `create_or_update'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2538:in `save_without_validation'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/validations.rb:1078:in `save_without_dirty'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:79:in `save_without_transactions'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:229:in `send'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:229:in `with_transaction_returning_status'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:182:in `transaction'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:228:in `with_transaction_returning_status'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:196:in `save'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:196:in `save'
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:723:in `create'

Я предполагаю, что это как-то связано со значением avatar.dirty?, потому что, когда это, безусловно, верно, когда это происходит. Вопрос в том, как мне полностью сбросить настройки, если есть изменения, которые нужно сохранить, и прервать загрузку аватара, когда установлен флаг?

1 Ответ

5 голосов
/ 27 апреля 2010

Очереди загруженных стилей скрепок в хэше:

{:original=>#<File:/tmp/stream20100427-6708-17hkcjs-0,6708,0>,  .... }

И этот хэш не очищается при удалении файла. Поэтому использовать нужно сделать это вручную:

 def before_save
    if @delete_avatar == 1.to_s 
      self.avatar.queued_for_write.clear
      self.avatar = nil 
    end
  end
...