如何将参数从yaml文件传递给构造函数,而不是明确地提到每个参数?

时间:2014-10-23 16:01:40

标签: ruby-on-rails ruby rabbitmq yaml bunny

我有这个初始化脚本,用于使用Bunny设置我的RabbitMq连接:

require 'yaml'
config = YAML.load_file('config/rabbitmq.yml')

puts config[Rails.env]
# $bunny = Bunny.new(config[Rails.env])

$bunny = Bunny.new(:host => config[Rails.env]["host"],
         :vhost => config[Rails.env]["vhost"],
         :user => config[Rails.env]["user"],
         :password => config[Rails.env]["password"],
)

$bunny.start
$bunny_channel = $bunny.create_channel

config[Rails.env]的内容是:

{"<<"=>nil, "host"=>"spotted-monkey.rmq.cloudamqp.com", "user"=>"myuser", "password"=>"mypassord", "vhost"=>"myvhost"}

Bunny.new命令的详细语法正常工作。但是,当我注释掉详细块时,请保留以下语法:

$bunny = Bunny.new(config[Rails.env])

我收到以下错误消息:

session.rb:296:in `rescue in start': Could not establish TCP connection to any of the configured hosts (Bunny::TCPConnectionFailedForAllHosts)

我期待它能够正常工作,因为在这两种情况下密钥都相同。有没有办法调用构造函数而不明确指定每个参数?

我尝试从yaml文件中删除"<<"=>nil行,但行为没有变化。

2 个答案:

答案 0 :(得分:1)

查看源代码后我发现了这个:

def hostnames_from(options)
  options.fetch(:hosts_shuffle_strategy, @default_hosts_shuffle_strategy).call(
    [ options[:hosts] || options[:host] || options[:hostname] || DEFAULT_HOST ].flatten
  )
end

似乎期待符号:host不是,字符串'host'这实际上是您调用初始值设定项的两种方式之间的唯一区别。尝试:

config = HashWithIndifferentAccess.new YAML.load_file('config/rabbitmq.yml')

答案 1 :(得分:1)

Bunny.new的实现可能依赖于可以通过符号键访问选项的事实,但是您可以从YAML.load_file获取字符串键。您可以使用Hash#with_indifferent_access

解决此问题
$bunny = Bunny.new(config[Rails.env].with_indifferent_access)