Application.rb中的Rails 4 HashWithIndifferentAccess会中断Rake命令

时间:2014-04-27 16:18:27

标签: ruby-on-rails-4 devise rake

将此代码添加到我的Application.rb会破坏rake命令并在重新加载rake任务时给出错误(如下所示)。我知道它可以找到' social_keys.yml'因为如果我将代码留在并运行rails应用程序,它会找到它并对Facebook进行身份验证就好了。

social_keys = File.join(Rails.root, 'config', 'social_keys.yml')
CONFIG = HashWithIndifferentAccess.new(YAML::load(IO.read(social_keys)))[Rails.env]
CONFIG.each do |k,v|
  ENV[k.upcase] ||= v
end

错误:

Error:[rake --tasks] rake aborted!
NoMethodError: undefined method `each' for nil:NilClass
/Users/cj/RubymineProjects/MyApp/config/application.rb:26:in `<class:Application>'
/Users/cj/RubymineProjects/MyApp/config/application.rb:10:in `<module:MyApp>'

以下是完整的代码和错误: https://gist.github.com/cdesch/11191336

我正在使用example application中的代码段代码。我怀疑它与HashWithIndifferentAccess Issuesimilar reference to HashWithIndifferentAccess有什么关系,虽然我对红宝石不够好,不知道它们是否相关。从错误消息中我可以收集到迭代哈希的问题。

如何修复此代码以使其工作或重写以执行相同的功能?代码应加载'social_keys.yml'作为环境变量,以便在Devise初始化期间使用。

像这样:

 config.omniauth :facebook, ENV["FACEBOOK_KEY"], ENV["FACEBOOK_SECRET"], { :scope => 'email, offline_access', :client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}}

如果这种方法不是最好的,是否有不同的方式将我的社交密钥作为环境变量?

1 个答案:

答案 0 :(得分:0)

我认为social_keys.yml中的信息未正确嵌套在rails-env键下。

如果你这样做

puts YAML::load(File.read(social_keys))
puts YAML::load(File.read(social_keys))[Rails.env]

后者应该是空的。