首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在为亚马逊s3添加载波初始化器后无法启动rails应用程序

在为亚马逊s3添加载波初始化器后无法启动rails应用程序
EN

Stack Overflow用户
提问于 2015-04-22 11:49:42
回答 1查看 2.1K关注 0票数 1

我正在尝试创建一个rails应用程序,使用载波将文件上传到S3。我遵循来自:https://github.com/carrierwaveuploader/carrierwave#using-amazon-s3的指示。因为本地上传很好。但是,当涉及到S3时,它会抛出以下错误:

代码语言:javascript
复制
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的载波说明)。然后,我尝试改为使用rubygem fog。也会抛出一个错误。但是现在它为undefined method抛出异常:

代码语言:javascript
复制
/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

我还找到了类似的问题。已经按照指示走了,但我什么也没得到。

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

Gemfile

代码语言:javascript
复制
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'

模型

代码语言:javascript
复制
class S3Post < ActiveRecord::Base
  mount_uploader :attachment, S3PostUploader
  validates :name, presence: true # validates names
end

表模式

代码语言:javascript
复制
  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

控制器

代码语言:javascript
复制
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

上传器

代码语言:javascript
复制
# 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

配置/初始化/载波.

代码语言:javascript
复制
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,但仍然无法使其工作。有人能帮我找出我在这里做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-23 08:50:27

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

fog是一款试图为主要云提供商(AWS、rackspace、google等)提供公共界面的宝石,但其结果是,gem变得相当大,而且大多数用户实际上只使用其中的一小部分。几个月前,我们决定将fog分解为fog核心,其中包含所有提供者共有的代码,然后是提供程序特定的gems。

fog-aws是具有AWS特定代码的gem (因此也包括S3)。为了向后兼容,雾宝石仍然存在,但只是提取了所有提取的宝石(它仍然有一些提供者还没有被提取)。

在较新版本的载波中的fog_provider设置允许您控制载波是否会尝试加载遗留的fog gem及其所有提供者,或者只是一个特定的提供者,例如fog。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29796637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档