该应用程序托管在Heroku上.
我正在开发Ubuntu Karmic.
我将要描述的问题发生在开发(在我的localhost上)和生产(在Heroku上).
将S3信用卡传递给回形针的标准方法是将它们放入config / s3.yml中,如下所示:
access_key_id: 12345678 secret_access_key: 903490409fdf09fshsfdoif/43432
当我这样做时,一切正常.但是这使得我很难与其他人分享我的代码,因此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
然后他们建议您创建config / initializers / s3.yml(注意稍微不同的路径)并将以下内容放入该文件中:
AWS::S3::Base.establish_connection!( :access_key_id => ENV['S3_KEY'],:secret_access_key => ENV['S3_SECRET'] )
但是,当我这样做时,回形针会抛出一个摇摆器并吐出以下错误信息:
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
很明显,这一切都在storage.rb模块中开始.单步执行堆栈跟踪:
标记了第176行的parse_credentials方法 – 这是代码中显示的调用:
def parse_credentials creds creds = find_credentials(creds).stringify_keys (creds[RAILS_ENV] || creds).symbolize_keys end
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
我无法看到find_credentials方法如何配备读取.bashrc文件中的值.它有两种情况可以从YAML读取,另一种情况是在寻找散列.
我的模型引用了这样的凭证:
has_attached_file :photo,(some code removed) :s3_credentials => "#{RAILS_ROOT}/config/initializers/s3.yml",
如果我从模型中删除:s3_credentials哈希,则stringify_keys错误消失,rails控制台会抛出find_credentials方法末尾出现的错误消息:即“凭据不是路径,文件或散列”.
所以我很难过.我意识到这对于Heroku的人来说可能是一个问题(我实际上是通过电子邮件发送这个链接,希望他们可以回复它),这也可能是思想机器人的问题.
正如我在开始时所说的那样,当我采用标准方法将我的密钥和秘密粘贴到config / s3.yml中时,我的应用程序正常工作,但我更喜欢使用Heroku建议的方法,因为它使我的方式变得更容易这意味着我可以将我的repo存储在我的公共github页面上,供其他人使用,而无需在Git中编写任何客户合并驱动程序,以保持我的api密钥不在公共领域之外.
我已经尝试将ENV变量粘贴在etc / bash.bashrc以及〜/ .bashrc中,重新启动后,我仍然遇到同样的问题.问题出现在开发机器和Heroku上.我已经确保将我的配置变量也推送到Heroku.
解决方法
诀窍是完全删除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'] }
无论如何,大卫,谢谢你的建议.我不知道你是否想更新Heroku文档,说有些用户不得不这样做.再次感谢.