为 amazon s3 添加载波初始化程序后无法启动 rails 应用程序
unable to start rails app after adding carrierwave initializer for amazon s3
我正在尝试创建一个 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
在网上搜索后发现还有rubygem名字叫fog
(我用的是fog-aws
,根据carrierwave的说明S3 我在上面提到过)。然后,我尝试改为使用 rubygem 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
Table 架构
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 中而不是硬编码。
我已经尝试了 uninstall/reinstall fog-aws
、carrierwave
gem 但仍然无法正常工作。谁能帮我找出我做错了什么?
问题是您使用的是当前发布的 carrierwave 版本,但遵循 master 的文档 - 两者相隔一年多。您可以在 github (https://github.com/carrierwaveuploader/carrierwave/blob/v0.10.0/README.md) or via rubydoc.info 上阅读 0.10.0 的自述文件。您需要切换到主版本的载波或修改您的代码以匹配旧的自述文件。
fog 是一个 gem,它试图为主要云提供商(AWS、rackspace、google 计算等)提供一个通用接口,但是其结果是 gem 变得相当大,大多数用户实际上只会使用其中的一小部分。几个月前,决定将 fog 拆分为 fog-core,其中包含所有提供商通用的代码,然后是特定于提供商的 gems。
fog-aws 是具有 AWS 特定代码(以及 S3)的 gem。雾 gem 仍然存在,为了向后兼容,但只是拉入所有提取的 gem(它仍然有一些尚未提取的提供者)。
较新版本的 Carrier wave 中的 fog_provider
设置允许您控制 Carrierwave 是否会尝试加载遗留雾 gem 及其所有提供者或仅特定的提供者,例如 fog-哇。
我正在尝试创建一个 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
在网上搜索后发现还有rubygem名字叫fog
(我用的是fog-aws
,根据carrierwave的说明S3 我在上面提到过)。然后,我尝试改为使用 rubygem 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
Table 架构
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 中而不是硬编码。
我已经尝试了 uninstall/reinstall fog-aws
、carrierwave
gem 但仍然无法正常工作。谁能帮我找出我做错了什么?
问题是您使用的是当前发布的 carrierwave 版本,但遵循 master 的文档 - 两者相隔一年多。您可以在 github (https://github.com/carrierwaveuploader/carrierwave/blob/v0.10.0/README.md) or via rubydoc.info 上阅读 0.10.0 的自述文件。您需要切换到主版本的载波或修改您的代码以匹配旧的自述文件。
fog 是一个 gem,它试图为主要云提供商(AWS、rackspace、google 计算等)提供一个通用接口,但是其结果是 gem 变得相当大,大多数用户实际上只会使用其中的一小部分。几个月前,决定将 fog 拆分为 fog-core,其中包含所有提供商通用的代码,然后是特定于提供商的 gems。
fog-aws 是具有 AWS 特定代码(以及 S3)的 gem。雾 gem 仍然存在,为了向后兼容,但只是拉入所有提取的 gem(它仍然有一些尚未提取的提供者)。
较新版本的 Carrier wave 中的 fog_provider
设置允许您控制 Carrierwave 是否会尝试加载遗留雾 gem 及其所有提供者或仅特定的提供者,例如 fog-哇。