【问题标题】:Carrierwave - Save nil if the image is not uploadedCarrierwave - 如果图像未上传,则保存 nil
【发布时间】:2015-06-26 23:22:30
【问题描述】:

我正在尝试将图像从本地文件系统迁移到保管箱,因此我正在使用carrierwave 保管箱 gem 将所有图像移动到保管箱。我能够存储从我的应用程序上传的新图像。我正在尝试移动现有图像。

我正在使用 Article.first.avatar?检查图像是否存在的方法,我在很多地方都使用过这种方法来处理我的应用程序中不同大小的图像。

当我使用上述方法来确定图像是否存在时,当图像不存在于 Dropbox 中时,它总是显示为真。看看我的控制台输出(2),

我的上传者:

class Avatar < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage: file
def store_dir
    if model
      "uploads/#{model.class.to_s.underscore}/#{model.id}/#{mounted_as}"
    else
      "uploads/#{mounted_as}/"
    end
 end 
end

控制台输出 (1)

>Article.first.avatar?
>false
#<AvatarUploader:0x007f9813f1fe70
 @file=
  #<CarrierWave::SanitizedFile:0x007f9813f1e688
   @content_type=nil,
   @file="/Users/work/project/app1/public/uploads/370/avatar/avatar.png",
   @original_filename=nil>,
 @model=
  ##Article model
 @mounted_as=:avatar,
 @storage=#<CarrierWave::Storage::File:0x007f9813f1fad8 @uploader=#<AvatarUploader:0x007f9813f1fe70 ...>>,
 @versions={}>

我更改了上传器如下:

class Avatar < CarrierWave::Uploader::Base
    include CarrierWave::MiniMagick
    storage: dropbox
    def store_dir
        if model
          "uploads/#{model.class.to_s.underscore}/#{model.id}/#{mounted_as}"
        else
          "uploads/#{mounted_as}/"
        end
     end 
    end

控制台输出(2)

>Article.first.avatar?
>true
    #<AvatarUploader:0x007f8574143ee8
@file=
 #<CarrierWave::Storage::Dropbox::File:0x007f8574143308
  @client=
  #<DropboxClient:0x007f8574143420
   @root="dropbox",
   @session=
    #<DropboxSession:0x007f8574143498
    @access_token=#<OAuthToken:0x007f8574143470 @key="123453333",      @secret="22222222222">,
   @consumer_key="abcdeafs",
   @consumer_secret="asdfasfj",
   @locale=nil,
   @request_token=nil>>,
   @config=
{:app_key=>"asdfasfasf",
 :app_secret=>"asdfkasfksf",
 :access_token=>"adfkjasfkhs",
 :access_token_secret=>"aksdfkhsfksf",
 :access_type=>"dropbox",
 :user_id=>"292929292"},
 @path="uploads/images/370/avatar.png",
 @uploader=#<AvatarUploader:0x007f8574143ee8 ...>>,
 @model=
  #Artcle Model>,
  @mounted_as=:image,
  @storage=
  #<CarrierWave::Storage::Dropbox:0x007f8574143c90
   @config=
    {:app_key=>"asdfasfasf",
    :app_secret=>"asdfkasfksf",
    :access_token=>"adfkjasfkhs",
    :access_token_secret=>"aksdfkhsfksf",
    :access_type=>"dropbox",
    :user_id=>"292929292"},
   @dropbox_client=
  #<DropboxClient:0x007f8574143420
   @root="dropbox",
   @session=
  1. 为什么当图像不存在时它显示“真”。
  2. 当图片不在 Dropbox 中时,我如何才能得到“假”。

【问题讨论】:

  • 你能更具体地描述问题吗?图片怎么不会上传?
  • @RockStar 更新了我的问题。

标签: ruby-on-rails ruby carrierwave


【解决方案1】:

我在黑暗中的刺是在 Carrierwave 内部,它返回的正常文件类(已清理的文件)通过检查文件是否存在来响应空:

https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/sanitized_file.rb#L144

在carrierwave dropbox gem 中,File 类(https://github.com/robin850/carrierwave-dropbox/blob/master/lib/carrierwave/storage/dropbox.rb#L45) 没有实现这一点。我猜你是否重新打开了课程并添加了

module CarrierWave
  module Storage
    class Dropbox < Abstract
      class File

        def empty?
          # use dropbox API to get the file and check the presence here
        end
      end
    end
  end
end

应该可以吧?

【讨论】:

  • 我在gem中添加了上述方法并通过返回“false”进行测试,但它总是返回“true”。默认为空?返回假结束
猜你喜欢
  • 2015-03-15
  • 1970-01-01
  • 2023-04-02
  • 2016-08-02
  • 1970-01-01
  • 2014-03-27
  • 2015-11-29
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多