我在Rails 3上使用Paperclip(带Amazon s3).我想使用更新操作删除现有附件without replacing it.

我只找到了这here个例子中的一个,但它无法运行,它无法删除,日志(log)中也没有说明原因.我想在表格上做这样的事情:

<%- unless @page.new_record? || !@page.image? -%>
    <%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>

(页面是模型的名称,图像是保存附件的属性名称)

但我如何检测该复选框,更重要的是,我如何删除图像?谢谢你的帮助!

推荐答案

首先,当你在一个表单中创建一个复选框时(看起来你就是这样),默认情况下,表单应该发送:image_delete,如果选中,则为"1",如果未选中,则为"0".方法声明如下所示:

def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")

这表明,如果愿意,可以指定其他值,但这当然是可选的.

其次,手动删除附件而不删除其所附加到的模型实例的调用是:

@page.image.destroy #Will remove the attachment and save the model
@page.image.clear #Will queue the attachment to be deleted

为了实现通过复选框删除图像的方法,可以在页面模型中添加如下内容:

class Page < ActiveRecord::Base
  has_attached_file :image

  before_save :destroy_image?

  def image_delete
    @image_delete ||= "0"
  end

  def image_delete=(value)
    @image_delete = value
  end

private
  def destroy_image?
    self.image.clear if @image_delete == "1"
  end
end

这样,当您创建表单并添加:image_delete复选框时,它将从用户实例加载默认值"0".如果选中该字段,则控制器会将图像_delete更新为"1",并在保存用户时判断是否要删除图像.

Ruby-on-rails相关问答推荐

RSpec系统测试无法从工厂访问新创建的记录

Puma 工作人员无法在 Ubuntu 20.04 VM 上的 Rails 5.2 中启动

为什么 Image_tag 产生images/...而不是assets/....?

在 Rails 中将毫秒转换为格式化日期

Postgres on Rails 致命:数据库不存在

如何在生产中部署 resque worker?

是否可以在 Rails 中否定范围?

Rails - 使用 %W

RSpec > 有没有办法用一个命令运行所有测试?

Rails 3:验证组合值

在 Rails 中创建随机 DateTime 的最佳方法

rails回形针和乘客`'识别'命令无法识别`

对象不支持此属性或方法 Rails Windows 64bit

link_to 将参数与 url 一起发送并在目标页面上抓取它们

ActiveRecord 事务中的错误处理?

通过get in rails传递参数数组

rake 任务中的 def 块

Ruby 中有与 slice 函数相反的函数吗?

Ruby 1.87 与 1.92 Date.parse

在 Rails 4.1 中,如何通过枚举符号查找记录?