我有downloads_controller.rb
一个download
操作,我想触发一个文件的下载,该文件位于名为downloads
的文件夹中,该文件夹位于名为{{1}的文件夹中我已添加到资产路径中。
download_assets
我可以使用以下方法成功访问文件夹中的任何文件:
<击> http://my-app.dev/assets/downloads/file.pdf 击>
为了使用send_file,我需要这个文件的文件系统路径而不是URL。我可以使用- download_assets [Added to asset paths]
- downloads
- file_1.pdf
- file_2.pdf
...
获取路径作为我的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
是否可以选择基于环境提供不同的路径,因为这似乎很脆弱?
答案 0 :(得分:2)
是
在/config/initializers
中创建一个名为“config.yml
”的文件,将其设置为:
<强> config.yml:强>
---
## NOT a tab character. 3 spaces. (In case that affects you)
development:
path_to_uploads: /path/to/downloads/for/development
production:
path_to_uploads: /path/to/downloads/for/production
test:
path_to_uploads: /path/to/downloads/for/test
然后在名为/config/initializers/
config.rb
)中创建一个文件
<强> config.rb:强>
APP_CONFIG = YAML.load_file("#{Rails.root}/config/initializers/config.yml")
跳到你的控制器:
<强> foo_controller.rb:强>
class FooController < ApplicationController
def download
# ...
path_to_uploads = Rails.root.to_s + APP_CONFIG["#{Rails.env}"]['path_to_uploads']
## By handing it the Rails.env object, it will return the current environment and handle selecting the correct environment for you.
end
end
使用YAML查找环境here.
时,有一个很好的RailsCast希望有所帮助!