ruby-on-rails - Carrierwave - 如果未上传图像,则保存 nil

标签 ruby-on-rails ruby carrierwave

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

我正在使用 Article.first.avatar?检查图像是否存在的方法,我在我的应用程序中的许多地方针对不同大小的图像使用了这种方法。

当我使用上述方法查找图像是否存在时,当图像不存在于 dropbox 中时,它总是说 true。看看我的控制台输出(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

控制台输出(一)

>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={}>

我按如下方式更改了 uploader :

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. 为什么图像不存在时显示“true”。
  2. 当图像不在 dropbox 中时,我如何得到“false”。

最佳答案

我在黑暗中的尝试是,在 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 ) 没有实现它。我猜你是否重新打开类(class)并添加了

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

它可能会起作用吗?

关于ruby-on-rails - Carrierwave - 如果未上传图像,则保存 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744420/

相关文章:

ruby-on-rails - 缓存序列化程序,无法缓存关联

ruby-on-rails - 如何从 url 查询参数中检查 rails params hash 是否包含双引号字符串?

ruby-on-rails - Rails 4 - CarrierWave default_url 不适用于 Assets 图像

ruby-on-rails - Ruby on Rails 内存管理

Carrierwave:文件名/store_dir 中的文件哈希和模型 ID

ruby-on-rails - Rails - 跨 3 个表的事件记录联接

ruby-on-rails - 如何用roo打开xls文件

ruby-on-rails - Ctags 生成最新版本的 gems

ruby-on-rails - `name' :String 的未定义方法 "SystemTimer"

ruby-on-rails - routes.rb 中的动态根到自己的用户#show