Rails 4,资产管道导致用户可下载文件被下载两次

我的app目录中有一个名为“uploads”的文件夹,用户可以在其中上传文件和下载文件。 我不希望uploads文件夹在公共目录中,因为我想控制下载授权。

在我的控制器中,我有:

send_file Rails.root.join('app', 'uploads', filename), :type => 'application/zip', :disposition => 'inline', :x_sendfile=>true 

这实际上工作正常。 问题是,当我在生产服务器上,当我运行rake资产:预编译,并有一个资产目录时,该文件下载两次。 第一次下载文件时,浏览器就像没有进行任何操作一样(没有加载旋转),但我看到数据正在谷歌Chrome开发人员网络选项卡中传输。 然后在下载文件后,会出现提示,询问用户是否要下载文件。

删除公共目录中的assets文件夹可以解决此问题,但我想使用资产管道。 我还尝试将require_tree中的资产管道需求更改为require_directory。

有谁知道如何让send_file与资产管道一起正常工作?

谢谢。

对于任何有这个问题的人,我解决了它。 通过

 'data-no-turbolink' => true 

进入link_to助手,阻止Turbolinks搞乱下载。

https://github.com/rails/turbolinks/issues/182

但是,如果您使用的是turbooboost = true的表单,而不是link_to,或者甚至使用link_to,您可以这样做:

在您的控制器内部,以及您的行动内部:

 def download respond_to do |format| format.html do data = "Hello World!" filename = "Your_filename.docx" send_data(data, type: 'application/docx', filename: filename) end format.js { render js: "window.location.href = '#{controller_download_path(params)}';" } end end 

controller_download_path替换为download操作的路径,

并放置在您的路线中postget相同的路径:

 post '/download' => 'your_controller#download', as: :controller_download get '/download' => 'your_controller#download', as: :controller_download