【问题标题】:Carrierwave - development upload issues after adding S3/Fog for productionCarrierwave - 添加 S3/Fo​​g 进行生产后的开发上传问题
【发布时间】:2014-03-25 22:35:34
【问题描述】:

我将我的生产 rails 3 应用设置为在 Heroku 上运行时使用 Fog/S3 进行存储。在此过程中,我对/config/initializers/carrierwave.rb 进行了一些更改。这是它的样子:

CarrierWave.configure do |config|

  if Rails.env.test? || Rails.env.development?
    config.root = Rails.root
    config.storage = :file
  else
    config.storage = :fog
    config.fog_credentials = {
    :provider               => 'AWS',                        # required
    :aws_access_key_id      => ENV['MY_ID'],                        # required
    :aws_secret_access_key  => ENV['MY_KEY']                        # required
    }
      config.fog_directory  = 'my-app'                     # required
      config.fog_public     = false                                   # optional, defaults to true
      #config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}  # optional, defaults to {}
  end
end

这是我的image_uploader

class ImageUploader < CarrierWave::Uploader::Base
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

上传在生产环境中运行良好。正在开发中将文件上传到正确的目的地,但在查看上传的图像时出现此错误:

ActionController::RoutingError (No route matches [GET] "/uploads/vendor/image/24/StoreB.png"):

我不确定如何解决这个问题。我的上传器中是否缺少某些内容?请帮忙?如果您需要更多信息,请告诉我。提前致谢!

编辑 抛出错误的代码示例:

<% @stores.each do |s| %>
        <div class="row">
                <div class= "col-xs-9 horz-cent">
                        <%= link_to image_tag("#{s.vendor.image}"), user_show_store_path(s) %>
                </div>
        </div>
<% end %>

【问题讨论】:

  • 您是否在production 环境或development 中遇到错误。另外,分享您尝试查看图像的代码还是直接在地址栏中尝试/uploads/vendor/image/24/StoreB.png 路径?
  • 仅在开发中。在上面添加了一个代码示例。
  • 如果您的文件在开发环境中上传成功,那么请您分享absolute path
  • 绝对路径是指文件的实际位置吗?如果是这样:application_name/uploads/vendor/image/24/StoreB.png
  • 绝对路径我的意思是application_name/.../uploads/vendor/image/24/StoreB.png

标签: ruby-on-rails carrierwave


【解决方案1】:

设置config.root如下

 config.root = Rails.root.join('public')

当前文件正在上传到Rails.root 目录中,这些文件无法从浏览器访问,因为它们不在public 目录中。

【讨论】:

  • 成功了,谢谢!但这究竟做了什么?
  • 这使您的文件被上传到application_name/public/uploads/vendor/image/24/StoreB.png 目录下。注意公共目录。控制器可以直接访问公共文件而无需指定任何路由。
  • 啊,我明白了。那么为什么这在没有路线的生产中起作用呢?这条线有什么关系?:config.fog_public = false
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多