2014-09-01 99 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