9

Użytkownicy w mojej witrynie mogą przesyłać własne zdjęcia do modelu lub wybrać z biblioteki. Gdy użytkownicy wybierają z biblioteki, wysyłam nazwę pliku jako ciąg do serwera {file: {url: 'url.jpg'}}. Nie znalazłem sposobu, w jaki firma Carrier może po prostu zaktualizować plik modelu bez przesyłania go. Mogę napisać warunek w moim modelu, który sprawdza istnienie tego parametru, a następnie model.file = File.open('str.jpg'). Czy to jest złe z widoku zabezpieczeń? Jak mogę "przesłać" pliki lub po prostu zaktualizować atrybut pliku, aby odwołać się do pliku, który jest już dostępny na serwerze?Carrierwave - "przesyłanie" pliku z ciągu znaków

Dzięki!

Odpowiedz

4

Twoje rozwiązanie z użyciem File.open będzie działać, ale należy sprawdzić, czy nazwa jest ważna z File.basename więc ktoś nie mógł przejść ../../secret_credentials.yml i udostępniać informacje, których nie chcesz. Warto byłoby również sprawdzić to na liście gotowych obrazów.

Jednak można to zrobić bardziej efektywnie, pomijając w tym przypadku CarrierWave.

Dodaj nowe pole o nazwie library_image, gdy ktoś chce użyć gotowego obrazu, a następnie ustawić library_image, jeśli chcą korzystać z własnego zdjęcia, rozbrojony library_image i przesłać zdjęcie jako normalne. Następnie dodać metodę pomocnika jak:

def avatar_url 
    if self.library_image? 
     "http://example.com/images/#{self.library_image}" 
    else 
     self.picture.url 
    end 
end 

ta zakłada, że ​​można znaleźć zaprogramowanych obrazów na http://example.com/images/[name] i używasz mount_uploader w CarrierWave nazwie picture.

Teraz, gdy chcesz wyświetlić swoje zdjęcie, możesz zadzwonić pod numer avatar_url, który sprawdzi, czy powinien zwrócić ustawiony adres URL, czy obraz, który przesłał.

Przykładem, jak można aktualizować library_image lub picture na podstawie oryginalnego pytanie:

if params[:file].is_a?(Hash) 
    model.library_image = params[:file][:url] 
    model.remove_picture = true 
else 
    model.library_image = nil 
    model.picture = params[:file] 
end 
+0

W jaki sposób można wykryć, że użytkownik jest przesłanie nowego obrazu? Mam na myśli, jaka jest nazwa funkcji zwrotnej, którą powinienem napisać, aby zresetować plik library_image? Dziękuję Ci! – CamelCamelCamel

+0

@CamelCamelCamel Zaktualizowałem moją oryginalną odpowiedź na przykładzie. –

+0

Jak mogę zwrócić plik jako ustawienie wstępne lub plik w zależności od avatar_url? – CamelCamelCamel

3

Chciałbym utworzyć inny zasób o nazwie LibraryImages, który przechowuje te pliki obrazów.

Będą to w relacji z klasą User przy użyciu asocjacji has_many. Druga to oddzielenie, gdy użytkownik chce użyć własnego obrazu zamiast wstępnie zdefiniowanego.

Proponuję dodać typ boolowski o nazwie "use_library", gdy zdecydują się użyć własnego obrazu, po prostu prześlą do użytkownika. Image bez żadnych problemów.

teraz w widoku po prostu zapytać, czy use_library zwraca true jeśli więc używać image_tag(user.library_image)