Стрекоза и короткие URL-адреса

Я использую Dragonfly в проекте, который возвращает большой поток фотографий, и хотел оптимизировать URL-адреса. В настоящее время я получаю URL-адреса изображений, например:

Http: // локальный: 3000 / СМИ / BAhbCFsHOgZmSSJgZmRlL2ZkZTAxYzQ0LTM4Y2UtNGU0ZS1iOWRlLWUwZmUxNWUwN2JmMC83Mzk1NmZlMC05ZTA5LTQzNWUtODUyMC00MzFlYzQxMzQ1OTQvb3JpZ2luYWwuanBlZwY6BkVUWwg6BnA6CnRodW1iSSIMMjQweDI0MAY7BkZbCTsHOgxjb252ZXJ0SSIQLXF1YWxpdHkgODAGOwZGMA / 240x240.jpg

Это более 256 байт. Я хотел бы что-то вроде:

http://localhost:3000/media/1024/240x240_medium.jpg

Это соответствует:

/media/:id/:format

Как мне добавить это при использовании Dragonfly и Rails, чтобы :format отображалось в цепочке операций, а :id использовалось для поиска модели или изображения? Спасибо!

Изменить:

Я добавил пользовательский Mime::Typeдля каждого из нужных мне форматов и получил следующие результаты:

# config/routes.rb
match "/photos/:id/:style", to: "photos#show", as: :media

# app/controllers/photos_controller.rb
def show
  @photo = Photo.find(params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.jpg { cache('public', 86400); redirect_to @photo.url(params[:style], 'jpg') }
    format.png { cache('public', 86400); redirect_to @photo.url(params[:style], 'png') }
    format.gif { cache('public', 86400); redirect_to @photo.url(params[:style], 'gif') }
  end
end

# app/views/photos/show.html.erb
<%= image_tag media_path(id: @photo.id, style: 'small', format: 'png') %>

Однако это приводит к 302 для каждого изображения (но в остальном работает нормально). Можно ли обработать это как рендеринг или каким-то образом выполнить внутреннее перенаправление (т.е. не требовать от клиента дублирования запросов)?


person Kevin Sylvestre    schedule 18.08.2011    source источник


Ответы (2)


вам не нужно использовать действие контроллера — вы можете использовать конечную точку Dragonfly — см. http://markevans.github.com/dragonfly/file.URLs.html#Routed_Endpoints

e.g.

match '/photos/:id/:style.:format' => Dragonfly[:images].endpoint { |params, app|
  Photo.find(params[:id]).image.thumb(params[:style]).encode(params[:format])
}

или что-то в этом роде (не пробовал приведенный выше код, но это будет что-то в этом роде)

person Mark Evans    schedule 18.08.2011

Я столкнулся с похожей ситуацией, когда клиенту нужен был короткий URL-адрес для загружаемых PDF-файлов.

Основываясь на ответе Марка и просмотрев документы по стрекозе, я пришел к следующему выводу:

#file.rb
class File < ActiveRecord::Base
  dragonfly_accessor :pdf
end

def pdf_link
  return "/pdf/#{self.filename}.pdf"
end  

#routes.rb
get '/pdf/:filename' => Dragonfly.app.endpoint { |params, app|
  File.where(filename: params[:filename]).first.pdf
}

Это не прямой ответ на вопрос, но, возможно, он все же может помочь кому-то, кто ищет способ сократить URL-адреса в стрекозе.

person Adam Cooper    schedule 25.07.2016