Mostrar imágenes con carrierwave en rails 3.1 en una carpeta de tienda privada
Tengo una aplicación Rails 3.1 y estoy agregando carrierwave para almacenar imágenes. Pero quiero almacenar esas imágenes fuera de la carpeta pública, porque solo deberían ser accesibles cuando los usuarios estén cargados en la aplicación. Así que cambié store_dir en carrerwave con el archivo inicializador:
CarrierWave.configure do |config|
config.root = Rails.root
end
Y mi cargador de onda portadora es así:
class ImageUploader < CarrierWave::Uploader::Base
...
def store_dir
"imagenes_expedientes/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
Las imágenes se almacenan correctamente y si uso la carpeta pública, todo funciona bien. Sin embargo, cuando intento mover cosas a la carpeta privada, las imágenes no se muestran y cuando trato de abrirlas en una nueva ventana aparece el siguiente error:
Routing Error
No route matches [GET] "/imagenes_expedientes/volunteer/avatar/15/avatar.jpg"
staba tratando de entregar los archivos usando send_file a través del controlador, pero en lugar de cargar la página, solo obtengo la imagen descargada.
def show
send_file "#{Rails.root}/imagenes_expedientes/avatar.jpg", :type=>"application/jpg", :x_sendfile=>true
end
Finalmente, las imágenes se muestran así en las vistas:
<%= image_tag(@volunteer.avatar_url, :alt => "Avatar", :class => "avatar round") if @volunteer.avatar? %>
Esto probablemente se resuelva de manera bastante fácil, pero como soy nuevo en Rails, no sé qué hacer. ¿Debo establecer una ruta? ¿O hay alguna forma de mostrar las imágenes usando el método send_file?
¡Gracias
RESPONDELogré mostrar imágenes usando x-sendfile y poniendo: disposition => 'en línea' según lo sugerido por clyfe. Hice una nueva acción en mi controlador:
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
Añadido a las rutas:
resources :volunteers do
member do
get 'image'
end
end
Y se muestra en las vistas:
<%= image_tag(image_volunteer_path(@volunteer), :alt => "Avatar", :class => "avatar round") if @volunteer.avatar? %>
Espero que ayude a otros!