Carrierwave - сохранить ноль, если изображение не загружено

Я пытаюсь перенести изображения из локальной файловой системы в dropbox, поэтому я использую Dropbox для переноса изображений, чтобы переместить все изображения в Dropbox. Я могу хранить новые изображения, которые загружаются из моего приложения. Я пытаюсь переместить существующие изображения.

Я использую Article.first.avatar? метод, чтобы проверить, существует ли изображение или нет, я использовал этот метод во многих местах для разных размеров изображений в моем приложении.

когда я использую вышеуказанный метод, чтобы узнать, существует ли изображение или нет, он всегда говорит true, когда изображение отсутствует в 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," ,="" @original_filename="nil">,
 @model=
 ##Article model
 @mounted_as=:avatar,
 @storage=#<carrierwave::storage::file:0x007f9813f1fad8 @uploader="#<AvatarUploader:0x007f9813f1fe70" ...="">>,
 @versions={}>
</carrierwave::storage::file:0x007f9813f1fad8></avataruploader:0x007f9813f1fe70>

Я изменил загрузчик следующим образом:

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=
 #</carrierwave::storage::dropbox:0x007f8574143c90></avataruploader:0x007f8574143ee8></avataruploader:0x007f8574143ee8>
<ul> <li> почему он показывает "true", когда изображение отсутствует.</li> <li> как я могу получить "false", когда изображение отсутствует в dropbox.</li> </ul>
1 ответ

Мой удар в темноте заключается в том, что внутри Carrierwave нормальный класс файла, который он возвращает (дезинфицированный файл), отвечает на пустое, проверяя, существует ли файл:

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

Внутри ящика Dropbox с несущей, класс 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

Возможно, это сработало?

licensed under cc by-sa 3.0 with attribution.