【问题标题】:unable to start rails app after adding carrierwave initializer for amazon s3为amazon s3添加carrierwave初始化程序后无法启动rails应用程序
【发布时间】:2015-04-22 11:49:42
【问题描述】:

我正在尝试创建一个 Rails 应用程序以使用载波将文件上传到 S3。我遵循来自:https://github.com/carrierwaveuploader/carrierwave#using-amazon-s3 的说明。对于本地上传工作正常。但是当涉及到 S3 时,它会抛出这个错误:

bin/rails:6: warning: already initialized constant APP_PATH
/Users/sancowinx/Code/rails/fileuploadercarrierwave/bin/rails:6: warning: previous definition of APP_PATH was here

从网上搜索后,我发现还有名为fog的rubygem(我使用的是fog-aws,根据我上面提到的带有S3的carrierwave的说明)。然后,我尝试改用 ruby​​gem fog。也会抛出错误。但现在它会为 undefined method 抛出异常:

/Users/sancowinx/Code/rails/fileuploadercarrierwave/config/initializers/carrierwave.rb:2:in `block in <top (required)>': undefined method `fog_provider=' for CarrierWave::Uploader::Base:Class (NoMethodError)

以上异常完整日志:http://pastebin.com/2AiepK7w

我还找到了similar question here。已经按照说明进行操作,但没有得到任何帮助。

一切都在 ruby​​ 版本:2.2.1,rails 版本:4.2.1 上运行

宝石文件

source 'https://rubygems.org'

gem 'rails', '4.2.1'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'bootstrap-sass', '~> 3.3.3'
gem 'uglifier', '>= 1.3.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc

group :development, :test do
  gem 'byebug'
  gem 'web-console', '~> 2.0'
  gem 'spring'
  gem 'better_errors'
  gem 'binding_of_caller'
end

gem 'fog-aws'
gem 'carrierwave', '~> 0.10.0'

型号

class S3Post < ActiveRecord::Base
  mount_uploader :attachment, S3PostUploader
  validates :name, presence: true # validates names
end

表架构

  create_table "s3_posts", force: :cascade do |t|
    t.string   "name"
    t.string   "attachment"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

控制器

class S3PostsController < ApplicationController
  def index
    @s3posts = S3Post.all
  end

  def new
    @s3post = S3Post.new
  end

  def create
    @s3post = S3Post.new(s3post_params)

    if @s3post.save
      redirect_to s3_posts_path, notice: "The S3Post #{@s3post.name} has been uploaded."
    else
      render 'new'
    end
  end

  def destroy
    @s3post = S3Post.find(params[:id])
    @s3post.destroy

    redirect_to s3_posts_path, notice: "The S3Post #{@s3post.name} has been deleted."
  end

  private
    def s3post_params
      params.require(:s3_post).permit(:name,:attachment)
    end
end

上传者

# encoding: utf-8

class S3PostUploader < CarrierWave::Uploader::Base

  storage :fog

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

end

config/initializer/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_provider = 'fog-aws'
  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => ENV['S3_KEY'],
    :aws_secret_access_key  => ENV['S3_SECRET']
  }
  config.fog_directory  = ENV['S3_BUCKET']
end

PS。我将 AWS 密钥存储在我的 ~/.bash_profile 中,而不是硬编码。

我已经尝试卸载/重新安装fog-awscarrierwave gem,但仍然无法正常工作。有人可以帮忙找出我做错了什么吗?

【问题讨论】:

  • Hartl 的 Rails 教程有一节 (11.4) 关于文件存储,我发现它很有帮助。只需确保为 S3 设置 AWS 策略,否则您将获得 403。

标签: ruby-on-rails ruby ruby-on-rails-4 amazon-s3 carrierwave


【解决方案1】:

问题是您使用的是当前发布的carrierwave 版本,但遵循了master 的文档——两者相隔一年多。您可以在 github (https://github.com/carrierwaveuploader/carrierwave/blob/v0.10.0/README.md) 或通过 rubydoc.info 阅读 0.10.0 的 README。您需要切换到载波的主版本或修改您的代码以匹配旧的自述文件。

fog 是一个 gem,它试图为主要的云提供商(AWS、rackspace、google 计算等)提供一个通用接口,但是这样做的结果是 gem 变得非常大,而大多数用户实际上只会使用其中的一小部分。几个月前,决定将雾拆分为雾核心,其中包含所有提供者通用的代码,然后是提供者特定的 gem。

fog-aws 是具有 AWS 特定代码(以及 S3)的 gem。为了向后兼容,雾 gem 仍然存在,但只是拉入所有提取的 gem(它仍然有一些尚未提取的提供程序)。

较新版本的carrier wave 中的fog_provider 设置允许您控制carrierwave 是尝试加载旧版fog gem 及其所有提供程序,还是仅加载特定的一个,例如fog-aws。

【讨论】:

  • 感谢您的指出。没有注意到有一个专门针对 v0.10.0 的 README 页面。决定关注rubydoc.info。我现在能够运行 rails 服务器,但必须将 rails 版本更改为 gem 'rails' 而不是 gem 'rails', '4.2.1'。现在我得到了错误break from proc-closure。但无论如何,rails 服务器现在终于可以运行了。
  • 我不确定,但如果您使用的是 0.10.0 版本的文档,您可能不想将 'gem "fog"、"~> 1.3.1' 放入 Gemfile,因为这个版本好像很老了,所以就用'gem "fog"'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 2011-03-06
  • 2011-11-17
  • 2020-05-19
相关资源
最近更新 更多