2

我有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

是否有替代方法可以根据环境提供不同的路径,因为这看起来很脆弱?

4

1 回答 1

2

是的。

/config/initializers创建一个名为 say " config.yml" 的文件时,像这样设置它:

配置.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

配置.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 查找环境的优秀 RailsCast

希望有帮助!


于 2014-07-30T23:20:58.263 回答