У меня есть приложение 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? %>
Надеюсь, это поможет другим!