Ruby on Rails send_file在刷新页面之前不起作用?

我正在研究Rails服务器,我可以从中下载本地存储的电影和动漫等。 这有点工作,但当我点击下载链接时,我必须刷新页面,以便下载实际开始。

这是处理下载的控制器:

class DownloadController < ApplicationController def index @title = params[:title] @name = params[:name] @path = '/media/sf_Anime,_VN,_LN/Watching, not watched yet/'+@title+'/'+@name send_file( @path ) end end 

这是链接到该控制器的链接:

  

编辑:我今天做了一些测试,并注意到如果我尝试发送较小的文件(文本或图像),下载链接会立即生效。 我还注意到下载链接实际上适用于电影,但下载开始需要20-30秒。 你知道导致这种延迟的原因吗?

你在使用turbolinks吗? Turbolinks显然与send_file不一致( https://github.com/rails/turbolinks/issues/182 )。 尝试在link_to帮助器中添加“data:{no-turbolink:true}”(或“’data-no-turbolink’=> true”),例如:

 <%= link_to "Downloadable File", downloadable_file, data: { no-turbolink: true } %> 

另请参阅: Rails 4,资产管道导致用户可下载文件下载两次 , rails不会将send_data作为文件 , Ruby on Rails send_file,控制器操作中的代码运行两次

编辑以反映以下评论。 我会简单地添加一个关注处理下载然后使用

 include Concerns::Downloads 

处理您的下载请求。 routes.rb看起来像这样。

 resources :movies do member do post 'download' end 

并在视图中

  <%= link_to 'Download', {:controller => 'movies', :action => 'download'}, {:method => :post } %> 

将文件移动到公用文件夹
仅将文件名添加到link_to中

 <%= link_to "Downloadable File", "/"+filename, %> 

尝试在send_file设置对附件的处置:

 class DownloadController < ApplicationController def index ... send_file( @path, :disposition => 'attachment' ) end end 

问题可能是您的浏览器正在尝试打开文件本身 – :disposition => 'attachment'会提示浏览器下载文件,即使它认为该文件是可以打开的文件。