我有downloads_controller.rb
一个单一的download
操作,我想触发一个文件的下载,该文件位于一个名为的文件夹中,该文件夹downloads
位于一个名为的文件夹download_assets
中,我已添加到我的资产路径中。
- download_assets [Added to asset paths]
- downloads
- file_1.pdf
- file_2.pdf
...
我可以使用以下方法成功访问文件夹中的任何文件:
http://my-app.dev/assets/downloads/file.pdf
为了使用 send_file 我需要该文件的文件系统路径而不是 URL。我可以使用 获取我的 Rails 项目根目录的Rails.root
路径,使用 获取文件的路径asset_path(path)
。但是,问题是因为我正在开发中,所以这个路径没有文件。该文件存储在:
path/to/rails/project/app/assets/download_assets/downloads/file.pdf
那个行动:
def download
@download = Download.find(params[:id])
file_path = "downloads/#{@download.filename}.pdf"
file_path = "#{Rails.root}#{ActionController::Base.helpers.asset_path(file_path)}"
send_file(file_path, :type=>"application/pdf", x_sendfile: true)
end
为了让它在开发中工作,我需要使用以下内容:
"#{Rails.root}/app/assets/download_assets/#{file_path}"
但是,这将在生产中失败,因为资产将被预编译并移动到assets
.
我目前的解决方法是:
file_path = "downloads/#{@download.filename}.pdf"
if Rails.env == "development" || Rails.env == "test"
file_path = "#{Rails.root}/app/assets/download_assets/#{file_path}"
else
file_path = "#{Rails.root}{ActionController::Base.helpers.asset_path(file_path)}"
end
是否有替代方法可以根据环境提供不同的路径,因为这看起来很脆弱?