1

我一直在关注上一个问题中提供的解决方案:

从 Controller 中的 application.rb 访问配置(Rails 3)

但首先将其应用于 Facebook 设置。

我首先创建了 facebook 配置文件:

#lib/facebook_config.rb
module FacebookConfig
  def self.config
    @@config ||= {}
  end

  def self.config=(hash)
    @@config = hash
  end

结尾

并定义了我的 YAML 文件,然后对其进行了初始化。

#config/facebook.yml
development:
  app_id = "id"
  app_secret = "secret"

test:
  app_id = "id"
  app_secret = "secret"

production:
  app_id = "id"
  app_secret = "secret"

#config/intializers/01.facebook_config.rb
require './lib/facebook_config'

FacebookConfig.config = YAML.load_file("config/facebook.yml")[Rails.env]

并像这样定义omniauth配置:

#config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  # The following is for facebook
  provider :facebook, FacebookConfig.config[:app_id], FacebookConfig.config[:app_secret], {:scope => 'email, read_stream, read_friendlists, friends_likes, friends_status, offline_access'}
end

但是,当我在开发模式下进行测试时,在启动 webrick 服务器时出现以下错误:

config/initializers/omniauth.rb:3:in `[]': can't convert Symbol into Integer (TypeError)

我想在访问配置文件时它应该是一个字符串而不是一个符号?

感谢您的任何提示。

4

1 回答 1

1

可能的原因可能是因为您的 facebook.yml 文件格式。

您可以在此处阅读有关 Yaml 的信息:http ://en.wikipedia.org/wiki/YAML

已编辑

我已经在虚拟应用程序中测试了您的代码 - 同样的错误,因为您当前拥有的 YAML 文件将返回字符串。

1.9.3p0 :014 > YAML.load_file("config/facebook.yml")[Rails.env]
 => "app_id = \"id\" app_secret = \"secret\""

所以你不能通过访问symbol,因为 Ruby 认为你在传递Numeric IndexString

将你的 facebook.yml 更新为这个(设置你的变量):

#config/facebook.yml
development:
  app_id: id
  app_secret: secret

test:
  app_id: id
  app_secret: secret

production:
  app_id: id
  app_secret: secret

facebook.yml 更新后,结果你会得到哈希:

YAML.load_file("config/facebook.yml")[Rails.env]
 => {"app_id"=>"id", "app_secret"=>"secret"}

符号化您的配置哈希键:

  def self.config=(hash)
    @@config = hash
    @@config.symbolize_keys!
  end

它会起作用的!

于 2012-05-27T04:54:42.660 回答