Rails Paperclip,使用default_url选项删除附件不会更改附件url

3

我的用户模型具有头像附件

class User
  has_attached_file :avatar, styles: { medium: '300x300#', thumb: '150x150#' }, default_url: :default_url_by_gender

  def default_url_by_gender
    if female?
      'female.svg'
    else
      'male.svg'
    end
  end
end

在上传图像之前,avatar.url会返回默认的URL。但当我上传并保存了一张图片,然后将其删除时,avatar.url仍然指向已删除的图片URL而不是默认URL。

我使用以下代码来删除avatar:

user.avatar = nil
user.save

在查看关于相同问题的问题1问题2后,我也尝试了这些方法。

user.avatar.destroy
user.save

#also tried this
user.update(avatar_file_name: nil, avatar_content_type: nil, avatar_file_size: nil)

我正在使用rails 5.1.6和paperclip (~> 5.2.0)

1个回答

1
你需要使用purge,而不是destroy。根据官方文档,https://edgeguides.rubyonrails.org/active_storage_overview.html#removing-files

要从模型中删除附件,请在附件上调用purge。如果你的应用程序设置为使用Active Job,则可以在后台执行删除操作。清除操作将从存储服务中删除blob和文件。

# Synchronously destroy the avatar and actual resource files.
user.avatar.purge

# Destroy the associated models and actual resource files async, via Active Job.
user.avatar.purge_later

删除资产的方式并不会删除实例和资产之间的附件关系:
user.avatar.destroy
user.avatar.attached? => true

user.avatar.purge
user.avatar.attached? => false

3
头像是一个纸夹附件,当我运行user.avatar.purge时,我收到“NoMethodError: undefined method 'purge' for #<Paperclip::Attachment:” 的错误提示。 - Selim Alawwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接