2011-08-18 128 views
3

我在一个项目中使用了蜻蜓,该项目返回大量照片并希望优化网址。目前我得到的图像的URL,如:蜻蜓和短网址

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

这是超过256个字节。我想是这样的:

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

即符合:

/media/:id/:format 

我怎么会去加入这个使用蜻蜓和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为每个图像(但在其他方面工作正常)。是否有可能将其作为渲染进行处理,或者以某种方式进行内部重定向(即不要求客户端进行重复请求)?

回答

8

你不应该需要使用控制器动作 - 你可以用一只蜻蜓终点 - 见http://markevans.github.com/dragonfly/file.URLs.html#Routed_Endpoints

例如

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

或类似的东西 (没试过上面的代码,但它会沿着这些线路的东西)

1

我碰到了类似的情况,其中客户端需要一个短网址可下载的pdfs。

大厦马克的回答来看,在dragonfly docs我想出了这一点:

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

这不是一个直接的问题的答案,但也许它仍然可以帮助别人寻找一种方式来缩短网址蜻蜓