2015-04-20 23 views
8

Próbuję przenieść obrazy z lokalnego systemu plików do Dropbox, więc używam karabinu dropbox gem firmy carrierwave, aby przenieść wszystkie obrazy do Dropbox. mogę przechowywać nowe obrazy, które są przesyłane z mojej aplikacji. Próbuję przenieść istniejące obrazy.Carrierwave - Zapisz zero, jeśli obraz nie zostanie przesłany

Używam Article.first.avatar? Aby sprawdzić, czy obraz istnieje, czy nie, użyłem tej metody w wielu miejscach dla różnych rozmiarów obrazów w mojej aplikacji.

Gdy używam powyższej metody, aby sprawdzić, czy obraz istnieje, czy nie, zawsze jest prawdziwe, gdy obraz nie występuje w skrzynce. Spójrz na moją wyjścia konsoli (2),

Moja uploader:

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 

wyjście konsola (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={}> 

Zmieniłem uploader następująco: wyjście

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 

konsoli (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. dlaczego pokazuje "prawda", gdy obraz nie jest obecny.
  2. Jak mogę uzyskać "fałsz", gdy obraz nie jest obecny w skrzynce.
+0

Czy możesz opisać pytanie bardziej szczegółowo? Jak obraz nie zostanie przesłany? – RockStar

+0

@RockStar zaktualizował moje pytanie. – Mano

Odpowiedz

0

Moja stab w ciemności jest to, że wewnątrz Carrierwave, normalna klasa plik powraca (odkażane plik) odpowiada opróżnić poprzez sprawdzenie, czy plik istnieje:

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

Wewnątrz gem carrierwave skrzynki referencyjnej , klasa File (https://github.com/robin850/carrierwave-dropbox/blob/master/lib/carrierwave/storage/dropbox.rb#L45) nie implementuje tego. Zgaduję, że ponownie otworzyłeś klasę i dodano

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 

Prawdopodobnie zadziałałaby?

+0

Dodałem powyższą metodę w gem i przetestowałem zwracając "false", ale zawsze zwraca "true". def jest pusty? return false koniec – Mano