Отображение изображений с несущей волной в рельсах 3.1 в папке частного магазина

У меня есть рельсы 3.1, и я добавляю несущую волну для хранения изображений. Но я хочу хранить эти изображения вне общедоступной папки, потому что они должны быть доступны только тогда, когда пользователи загружаются в приложение. Итак, я изменил store_dir в carrerwave с помощью файла инициализатора:

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

И мой загрузчик carrierwave выглядит следующим образом:

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

Изображения хранятся правильно, и если я использую общую папку, все работает нормально. Однако при попытке переместить объекты в личную папку изображения не отображаются, и когда я пытаюсь открыть их в новом окне, я получаю следующую ошибку:

Routing Error

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

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

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

Наконец, изображения отображаются в представлениях следующим образом:

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

Это, вероятно, решается довольно легко, но поскольку я как-то новичок в Rails, я не знаю, что с этим делать. Стоит ли проложить маршрут? Или есть способ отображения изображений с помощью метода send_file?

Спасибо!

ОТВЕТ

Мне удалось отобразить изображения с помощью x-sendfile и поместить : disposition => 'inline' , как было предложено clyfe . Я сделал новое действие в своем контроллере:

  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

Добавлено в маршруты:

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

И отображено в представлениях:

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

Надеюсь, это поможет другим!

11
задан Community 23 May 2017 в 12:15
поделиться