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