2014-09-01 78 views
0

我有这个链接下载Ruby on Rails的 - 不下载文件

<%= link_to "Curriculum Vitae", "/download/#{@user.candidato.cv.url}/#{@user.candidato.cv.content_type}" %> 

如果我做了坏的方式,而不控制方法的下载工作。但是我在互联网上看过很多帖子,说这是一个糟糕的做法,所以我尝试了这个好方法。

这是我的控制器:

def download 
     send_file params[:url] , :type => params[:type], :x_sendfile => true 
    end 

和路线

match '/download/:url/:type', to: 'users#download', via: 'get' 

当我点击链接这表明:

No route matches [GET] "/download/system/candidatos/cvs/000/000/001/original/blank_CV_template_Microsoft_Word.doc" 

我搜索无处不在,我可以似乎找不到任何东西。对于文件和我正在使用回形针

回答

0

什么为我做:

控制器:

def download 
    path = params[:url] 
    send_file "#{path}.#{params[:format]}" , :type => params[:type], :x_sendfile => true 
    end 

格式加入,因为即使在控制台中,路径中也包含了它从未做过的控制器中的扩展。

查看:

<%= link_to "Curriculum Vitae", :action => :download, :url => @user.candidato.cv.path, :type => @user.candidato.cv.content_type %> 

路线文件:

match '/download/:url', to: 'users#download', via: 'get' 
+0

您可以在48小时后将自己的答案标记为已接受,以便其他可能提及此问题的用户立即获得正确答案。 – 2014-09-01 11:54:12

0

您的路线和方法名称不匹配。如果你看一下“/ download /:url /:type”和“/download/system/candidatos/cvs/000/000/001/original/blank_CV_template_Microsoft_Word.doc”,它会考虑哪一个URL和类型。按照你的匹配路线,你的链接路径应该是这样的 - “下载/网址/类型”。

或者你也可以采用更简单的方法。在您的链接标记只是通过简历只有ID,并在你的下载方法处理它

match '/download/:id', to: 'users#download', via: 'get' 

def download 
    cv = Cv.find(params[:id]) 
    send_file cv.url , :type => cv.content_type, :x_sendfile => true 
end 
+0

我来能够下载该文件。但是我需要在cv.url后添加.doc,因为它没有与它一起出现。我也试过路径,它也没有在最后包含扩展名,所以它不能读取文件。 – Lokuzt 2014-09-01 09:54:27

+0

你可以使用'send_file cv.url,:type => cv.content_type,:x_sendfile => true:filename =>“blank_CV_template_Microsoft_Word.doc”' – 2014-09-01 09:59:21

+0

你可以做一些变通的操作来添加你的扩展到你的url ex - cv .url +“.doc”。但不是我不确定它对您的要求有多灵活。 – 2014-09-01 10:01:07