我正在为我们的一个项目开发一个 Rails 3 引擎。为了调试问题,我将 gem 声明移动到 :path
语句,如边缘指南所建议的那样。在对aws-s3
宝石的要求之后,它大约是两颗宝石。现在,当我尝试使用 rails s
启动开发服务器时,我从aws-s3
收到如下所示的错误:
/Users/me/.rvm/gems/ruby-1.9.3-p194@xproject/gems/aws-s3-0.6.3/lib/aws/s3/extensions.rb:212:in 'const_missing_from_s3_library': 未初始化常量 MyEngineNamespace::Engine (NameError)
S3 gem 中的关联代码位如下所示:
def const_missing_from_s3_library(sym)
if sym.to_s =~ /^(w+)(Bucket|S3Object)$/
const = const_set(sym, Class.new(AWS::S3.const_get($2)))
const.current_bucket = $1.underscore
const
else
const_missing_not_from_s3_library(sym)
end
end
alias_method :const_missing_not_from_s3_library, :const_missing
alias_method :const_missing, :const_missing_from_s3_library
但我完全不确定为什么调用这段代码; 引擎不会(故意)接触 S3。 所以... 嗯?
不是 100% 回答您的问题,但它会以某种方式解决您的问题:
建议使用 fog 而不是 aws-s3,根据Sidekiq wiki,aws-s3 不是线程安全的。Fog在访问和积极支持的云服务方面更加灵活。这是开始使用 Fog 和 S3 的好指南。
啊。想通了。问题不在于 S3(正如我所怀疑的那样),而是我在Gemfile
中包含引擎的方式,我没有将其包含在问题中(所以难怪没有人弄清楚)。
这有效:
gem "my_engine", :path => "/Users/me/Projects/my-engine", :require => 'my-engine'
这不会:
gem "my_engine", :path => "/Users/me/Projects/my-engine"
:require
参数似乎在设置常量时很有用。