2011-08-18 2 views
3

J'utilise Dragonfly dans un projet qui renvoie un grand nombre de photos et cherchait à optimiser les URL. Je reçois actuellement des URL d'image comme:Libellule et URL courtes

http://localhost:3000/media/BAhbCFsHOgZmSSJgZmRlL2ZkZTAxYzQ0LTM4Y2UtNGU0ZS1iOWRlLWUwZmUxNWUwN2JmMC83Mzk1NmZlMC05ZTA5LTQzNWUtODUyMC00MzFlYzQxMzQ1OTQvb3JpZ2luYWwuanBlZwY6BkVUWwg6BnA6CnRodW1iSSIMMjQweDI0MAY7BkZbCTsHOgxjb252ZXJ0SSIQLXF1YWxpdHkgODAGOwZGMA/240x240.jpg

Ce qui est plus de 256 octets. Je voudrais quelque chose comme:

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

Cela est conforme à:

/media/:id/:format 

Comment pourrais-je aller sur l'ajout de ceci lorsque vous utilisez Dragonfly et Rails tels que :format cartes à une chaîne d'opérations et :id est utilisé pour trouver le modèle ou l'image? Merci!

Edit:

J'ai ajouté coutume Mime::Type pour chacun des formats que j'ai besoin et ont le travail suivant:

# 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') %> 

Cependant il en résulte une 302 pour chaque image (mais autrement fonctionne bien). Est-il possible de gérer cela comme un rendu ou d'une certaine façon faire une redirection interne (c'est-à-dire ne pas obliger le client à faire des demandes en double)?

Répondre

8

vous ne devriez pas avoir besoin d'utiliser une action de contrôleur - vous pouvez utiliser un point final de libellule - voir http://markevans.github.com/dragonfly/file.URLs.html#Routed_Endpoints

par exemple

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

ou quelque chose comme ça (n'ont pas essayé le code ci-dessus, mais ce sera quelque chose le long de ces lignes)

1

J'ai couru dans une situation similaire où le client avait besoin d'une URL courte pour Pdfs téléchargeables.

Miser sur la réponse de Mark et en regardant le dragonfly docs je suis venu avec ceci:

#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 
} 

Ce n'est pas une réponse directe à la question, mais il peut peut-être encore aider quelqu'un à la recherche d'un moyen de réduire urls libellule

Questions connexes