使用Active Storage上传文件后执行操作

时间:2019-03-14 22:20:32

标签: ruby-on-rails rails-activestorage

我的模型有一个has_many_attached :photos

首次创建此模型时,它有0张照片。如果我运行photos.attached?,我将得到false

当用户将一些文件上传到照片时,我需要执行一些操作,但这只是第一次。我尝试使用before_update :if photos.attached?。但是我需要知道用户是否正在专门更新照片。

有没有办法知道用户是否正在尝试更新照片?还是有一种简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

您可以使用dirty?方法

class Post < ApplicationRecord
  has_many_attached :photos

  before_update :do_whatever, if: -> { photos.dirty? } 

  def do_whatever
    # doing something
  end
end

您也许还可以尝试before_update :do_whatever, if: -> { photos_changed? }

答案 1 :(得分:0)

在rails模型和选项“ on::create”和“ update”中检查回调(after_create,after_save等)。

答案 2 :(得分:0)

  

Rails尚未添加向文件附件添加验证的功能。参见Issue #31656

尝试这种方法:

验证mime-types

<%= f.file_field :photos, accept: "image/png,image/gif,image/jpeg', multiple: true %>

您仍然需要添加模型验证。有关如何使用自定义验证器的信息,请参见此帖子Validating the Content-Type of Active Storage Attachments

要限制您的action仅执行一次,您可以在操作成功终止后向model添加一个布尔字段并将其设置为true。按照建议Antarr Byrd使用before_update,检查每张照片是否已附加到模型上。