ste*_*och 8 ruby-on-rails heroku environment-variables amazon-s3
我正在开发一个使用回形针在Amazon S3上存储东西的rails应用程序.该应用程序托管在Heroku上.我正在开发Ubuntu Karmic.
我要描述的问题发生在开发(在我的localhost上)和生产(在Heroku上).
将S3信誉传递给回形针的标准方法是将它们放入config/s3.yml中,如下所示:
access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432
Run Code Online (Sandbox Code Playgroud)
当我这样做时,一切正常.但这使我很难与其他人分享我的代码,因此Heroku建议了另一种方法 - http://docs.heroku.com/config-vars.
他们建议您将S3_KEY和S3_SECRET放入.bashrc中,如下所示:
S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET
Run Code Online (Sandbox Code Playgroud)
然后他们建议您创建config/initializers/s3.yml(注意稍微不同的路径)并将以下内容放入该文件中:
AWS::S3::Base.establish_connection!(
:access_key_id => ENV['S3_KEY'],
:secret_access_key => ENV['S3_SECRET']
)
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,paperclip抛出一个摇摆器并吐出以下错误信息:
undefined method `stringify_keys' for #<String:0xb6d6c3f4>
/vendor/plugins/paperclip/lib/paperclip/storage.rb:176:in `parse_credentials'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:138:in `extended'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `instance_eval'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `extended'
.... other stuff
Run Code Online (Sandbox Code Playgroud)
很明显,这一切都在storage.rb模块中开始.单步执行堆栈跟踪:
标记了第176行的parse_credentials方法 - 这是代码中显示的调用:
def parse_credentials creds
creds = find_credentials(creds).stringify_keys
(creds[RAILS_ENV] || creds).symbolize_keys
end
Run Code Online (Sandbox Code Playgroud)
parse_credentials方法尝试调用另一个方法find_credentials,这就是我认为问题所在.下面是find_credentials的代码:
def find_credentials creds
case creds
when File
YAML::load(ERB.new(File.read(creds.path)).result)
when String
YAML::load(ERB.new(File.read(creds)).result)
when Hash
creds
else
raise ArgumentError, "Credentials are not a path, file, or hash."
end
end
Run Code Online (Sandbox Code Playgroud)
我无法看到find_credentials方法如何配备来读取.bashrc文件中的值.它有两种情况可以从YAML读取,另一种情况是在寻找散列.
我的模型引用了这样的凭证:
has_attached_file :photo,
(some code removed)
:s3_credentials => "#{RAILS_ROOT}/config/initializers/s3.yml",
Run Code Online (Sandbox Code Playgroud)
如果我从模型中删除:s3_credentials哈希,则stringify_keys错误消失,rails控制台会抛出find_credentials方法末尾出现的错误消息:即"凭据不是路径,文件或散列".
所以我很难过.我意识到这对于Heroku的人来说可能是一个问题(我实际上是通过电子邮件发送这个链接,希望他们可以回复它),这也可能是思想机器人的问题.
正如我在开始时说的那样,当我采用标准方法将我的密钥和秘密粘贴到config/s3.yml中时,我的应用程序工作得很好,但我更喜欢使用Heroku建议的方法,因为它使我的方式变得更容易这意味着我可以将我的repo存储在我的公共github页面上,供其他人使用,而无需在Git中编写任何客户合并驱动程序,以保持我的api密钥不在公共领域之外.
我已经尝试将ENV变量粘贴在etc/bash.bashrc以及〜/ .bashrc中,重新启动后,我仍然遇到同样的问题.问题出现在开发机器和Heroku上.我已经确保将我的配置变量也推送到Heroku.
ste*_*och 13
经过多次搜索,我找到了答案 - http://tammersaleh.com/posts/managing-heroku-environment-variables-for-local-development
诀窍是完全删除S3.rb文件,只需参考模型中的ENV变量,如下所示:
has_attached_file :photo,
#...
:storage => :s3,
:bucket => ENV['S3_BUCKET'],
:s3_credentials => { :access_key_id => ENV['S3_KEY'],
:secret_access_key => ENV['S3_SECRET'] }
Run Code Online (Sandbox Code Playgroud)
无论如何,大卫,谢谢你的建议.我不知道你是否想更新Heroku文档,说有些用户不得不这样做.再次感谢.