ruby-on-rails - 回形针:删除附件和 "can' t 将 nil 转换为字符串”错误

标签 ruby-on-rails paperclip

我正在使用 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? 有关。值,因为当发生这种情况时它肯定是真的。问题是,如果要保存更改并在设置标志时中止头像上传,我该如何完全重置?

最佳答案

Paperclip 将上传的文件样式以散列形式排列:

{: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

关于ruby-on-rails - 回形针:删除附件和 "can' t 将 nil 转换为字符串”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713045/

相关文章:

javascript - 如何在 Rails 中的不同文件中使用我的 javascript 函数

ruby-on-rails - 语法错误 : (irb):26: both block arg and actual block given

ruby-on-rails - 使用范围来过滤 Rails 5 中的结果

ruby-on-rails - 有没有办法获取 Rails 服务器运行的耗时?

ruby-on-rails - 上传响应式背景图片

ruby-on-rails - Rails 回形针图像 URL 上传 - 不保存图像

ruby-on-rails - 如何学习/教授 cucumber 小 cucumber

javascript - 如何从浏览器触发扫描仪?

ruby-on-rails - Rails/paperclip 的新手 - Paperclip 不会保存

ruby-on-rails - Nokogiri (1.6.2) 加载错误,ruby 2.0,rails 4.1.1