【问题标题】:CarrierWave: detect if an image has already been uploadedCarrierWave:检测图像是否已经上传
【发布时间】:2013-11-07 19:22:54
【问题描述】:

模型使用图像的远程 url 播种,这意味着它不是在 Rails 中创建的 db 条目。然后第一次从 Rails 中的数据库中获取它,我想检测图像尚未上传,为图像 url 分配 remote_seed_url 并保存!触发 CarrierWave 上传。显然,我只想这样做一次,但下面的代码有时会多次上传同一张图片。

class Item
    include Mongoid::Document
    include Sunspot::Mongoid2

    field :image, type: String
    field :remote_seed_url, type: String #URL for image
    mount_uploader :image, ImageUploader 
end

然后在控制器中

def show
    @ item = Item.find(params[:id])
    # if CarrierWave has already uploded then do nothing
    if !@item.image?
        @item.image = @item.remote_seed_url # next save will trigger the upload?
        @item.save!
    end
    respond_to do ...
end

@item.image 的值通常是“new”或“old”和@item.image?当我看到它已经上传了图像时,有时会返回 false。这会导致上述代码多次上传。

  1. 控制器代码对只上传一次图像是否正确?
  2. 有没有什么方法可能是我把事情搞砸了并导致了@item.image?当它应该为真时返回假?也许是图像老化?

【问题讨论】:

  • 为了进一步复杂化,我运行了一项定期将新数据分层到对象中的作业,这可能会更改时间戳。这可能是 CarrierWave 的问题吗?分层不会改变安装 CarrierWave 的字段。
  • 似乎没人知道 CarrierWave?哦,我已经在第一次上传时设置的数据库中添加了我自己的标志。我在触发另一个之前检查它。这解决了问题,但以非 CarrierWave 的方式。

标签: ruby-on-rails image carrierwave image-caching


【解决方案1】:

上传器挂载到一个字段后,当你调用该字段时,你会得到一个上传器对象。如果要检查是否有文件,则应在该对象上调用“文件”:

[1] pry(main)> item.image.class
=> ImageUploader
[2] pry(main)> item.image.file.class
=> CarrierWave::SanitizedFile
[3] pry(main)> item.image.file.nil?
=> false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2015-01-14
    • 2011-10-29
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多