Wyświetlanie obrazów z carrierwave w rails 3.1 w prywatnym folderze sklepu

Mam aplikację rails 3.1 i dodaję carrierwave do przechowywania obrazów. Ale chcę przechowywać te obrazy poza folderem publicznym, r ponieważ powinny być dostępne tylko wtedy, gdy użytkownicy są ładowani w aplikacji. Więc zmieniłem store_dir w carrerwave z pliku inicjalizatora:

CarrierWave.configure do |config|
  config.root = Rails.root
end

A mój Uploader carrierwave idzie tak:

class ImageUploader < CarrierWave::Uploader::Base
...
def store_dir
  "imagenes_expedientes/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

Obrazy są przechowywane poprawnie i jeśli używam folderu publicznego wszystko działa dobrze. Jednak podczas próby przeniesienia rzeczy do folderu prywatnego, obrazy nie są wyświetlane i gdy próbuję je otworzyć w nowym oknie, pojawia się następujący błąd:

Routing Error

No route matches [GET] "/imagenes_expedientes/volunteer/avatar/15/avatar.jpg"

Próbowałem dostarczyć pliki za pomocą send_file przez kontroler, ale zamiast ładować stronę, dostaję tylko obraz pobrany.

  def show
    send_file "#{Rails.root}/imagenes_expedientes/avatar.jpg", :type=>"application/jpg", :x_sendfile=>true
  end

Wreszcie obrazy są wyświetlane w ten sposób w widokach:

<%= image_tag(@volunteer.avatar_url, :alt => "Avatar", :class => "avatar round") if @volunteer.avatar? %>

Może to być rozwiązane dość łatwo, ale ponieważ jestem w jakiś sposób nowy w Rails, Nie wiem, co zrobić. Mam wyznaczyć trasę? A może jest i tak do wyświetlanie obrazów za pomocą metody send_file?

Dzięki!

Odpowiedź

Udało mi się wyświetlić obrazy za pomocą x-sendfile i umieścić :disposition => 'inline' zgodnie z sugestią clyfe. Zrobiłem nową akcję w moim kontrolerze:

  def image
    @volunteer = Volunteer.find(params[:id])
    send_file "#{Rails.root}/imagenes_expedientes/#{@volunteer.avatar_url}",:disposition => 'inline', :type=>"application/jpg", :x_sendfile=>true
  end

Dodane do tras:

  resources :volunteers do
    member do
      get 'image'
    end 
  end

I wyświetlane w widokach:

<%= image_tag(image_volunteer_path(@volunteer), :alt => "Avatar", :class => "avatar round") if @volunteer.avatar? %>

Mam nadzieję, że pomaga innym!

Author: Community, 2011-11-11

1 answers

:disposition => 'inline' sprawi, że Twoje obrazy będą wyświetlane w przeglądarce zamiast pojawiać się w oknie pobierania.

def show
  send_file "#{Rails.root}/imagenes_expedientes/avatar.jpg", :disposition => 'inline', :type=>"application/jpg", :x_sendfile=>true
end

W zależności od rozmiarów obrazów i liczby użytkowników możesz przenieść tę akcję do aplikacji metalowej lub oddzielnej, aby nie blokować serwera.

 8
Author: clyfe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 11:44:33