下载Rails资产 - 开发与生产中的文件路径

时间:2013-08-08 11:19:09

标签: ruby-on-rails ruby controller download sendfile

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

是否可以选择基于环境提供不同的路径,因为这似乎很脆弱?

1 个答案:

答案 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

希望有所帮助!