我开发使用回形针存储在Amazon S3上的东西一个Rails应用程序。 该应用程序托管在Heroku上。 我开发Ubuntu的业报。

这是我将要描述的问题在发展中出现(在我的本地)和生产(在Heroku上)。


传递S3 creds至纸夹的标准方法是通过将它们在配置/ s3.yml像这样:

access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432

当我这样做,一切都运行得很好。但是,这使得它很难分享我与别人的代码,以便Heroku的建议的替代方法 - 的http://文档。 heroku.com/config-vars

他们提醒,你应该把你S3_KEY和S3_SECRET到你的.bashrc像这样:

S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET

然后,他们建议你创建的config /初始化/ 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错误消失和导轨控制台抛出出现在find_credentials方法结束时的错误消息:即“凭证不是路径,文件,或散列”

所以我难倒。我意识到,这可能是在Heroku的家伙(我是谁究竟要在,希望他们能解此链接通过电子邮件发送给)一个问题,它也可能在thoughtbot的杜兹的问题。

正如我在开始时说,我的应用程序正常工作时,我把我的坚持密钥和密码进入配置/ s3.yml的标准方法,但我宁愿因为它使事物的方式更容易使用Heroku的建议方法对我来说,这意味着我可以存储我的公开GitHub的网页上我的回购为他人而无需编写任何客户使用合并司机的Git让我的API密钥了公共领域。

我试图在等/ bash.bashrc粘附的ENV变量以及〜/ .bashrc中和重新启动后,我仍然有同样的问题。在Heroku开发机器上以及出现的问题。我确信把我的配置 - 瓦尔到Heroku的为好。

有帮助吗?

解决方案

在一番搜索我找到了答案在这里 - 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'] }

总之,大卫,感谢您的建议。我不知道,如果要更新Heroku的文档说,一些用户不得不做这种方式。感谢虽然一次。

其他提示

重命名文件config/initializers/s3.ymlconfig/initializers/s3.rb,并给它一个尝试。

下面是你的问题:

:bucket         => ENV['S3_BUCKET'],

需要为

:bucket         => <%= ENV['S3_BUCKET'] %>,

即。该分配不被解释。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top