错误"未初始化的常量AWS(NameError)"

bez*_*oon 38 ruby-on-rails amazon-s3 amazon-web-services ruby-on-rails-4 aws-sdk-ruby

这是说AWS未初始化.我使用了aws-sdk-core gem.

我尝试使用aws-sdk gem,问题仍然存在.

这是initializers/aws.rb文件:

AWS.config(:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
                      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'])

s3 = AWS::S3.new
AVATAR_BUCKET = s3.buckets[ENV['AVATAR_BUCKET_NAME']]
Run Code Online (Sandbox Code Playgroud)

当我尝试运行服务器或打开控制台时,我收到此错误:

/initializers/aws.rb:1:in`':未初始化的常量AWS(NameError)

Tre*_*owe 112

如果您收到此错误并且安装了"aws-sdk"gem,则可能无意中升级到了aws-sdk gem的版本2.版本2使用Aws命名空间,而不是AWS.这允许版本1和版本2在同一应用程序中使用.

有关更多信息,请参阅此博客文章.

  • 对于目前遇到此问题的人来说,这个答案很可能是正确的答案.我回答的原始问题早于aws-sdk版本2. (2认同)

DrS*_*ork 24

您需要安装/使用该-v1版本aws-sdk.只需做gem 'aws-sdk'require 'aws-sdk'可能使用2.x版本aws-sdk.

为避免混淆,对于需要1.x的脚本,请使用:

require 'aws-sdk-v1' # not 'aws-sdk'
Run Code Online (Sandbox Code Playgroud)

对于需要2.x的脚本,请使用:

gem 'aws-sdk', '~> 2'
Run Code Online (Sandbox Code Playgroud)

正如GitHub文档所示.


Sim*_*zen 11

您可能会收到此错误,因为您没有在Gemfile中定义正确的aws sdk版本.在重新捆绑安装了版本1或2的旧应用程序时可能会发生这种情况.

确保要安装的版本:

aws-sdk版本3

gem 'aws-sdk', '~> 3'

# call sdk    
Aws.<whatever>
Run Code Online (Sandbox Code Playgroud)

aws-sdk版本2

gem 'aws-sdk', '~> 2'

# call sdk    
Aws.<whatever>
Run Code Online (Sandbox Code Playgroud)

aws-sdk版本1

# version constraint
gem 'aws-sdk', '< 2'

# or 

# use the v1 gem
gem 'aws-sdk-v1'

# call sdk    
AWS.<whatever>
Run Code Online (Sandbox Code Playgroud)

v1的作用域是在AWSv2和v3作用域下Aws=>这允许你并排运行v1和v2.


Chr*_*son 6

听起来好像宝石不存在于您的加载路径中或者不是必需的.

你的入口Gemfile应该是

gem 'aws-sdk'
Run Code Online (Sandbox Code Playgroud)

require 'aws-sdk'只要您使用bundle exec rails server或启动应用程序,这将隐式执行应用程序初始化bundle exec rails console.

或者,如果上面的代码在非rails应用程序中,则只需放在require 'aws-sdk'第一行.

  • @shaffooo如果您的项目的根目录中没有Gemfile,那么Trevor Rowe的答案可能与您的问题更相关.当您使用名为Bundler的Ruby依赖关系管理工具时,需要一个名为Gemfile的文件. (2认同)