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

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

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

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

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

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?

Спасибо!

ANSWER

Мне удалось отобразить изображения с помощью 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? %>

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

4b9b3361

Ответ 1

:disposition => 'inline' заставит ваши изображения отображаться в браузере вместо того, чтобы открывать диалоговое окно загрузки.

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

В зависимости от размеров изображений и количества пользователей, которые вы могли бы переместить это действие в металлическое приложение, или отдельно, чтобы не блокировать сервер.