1

在我的 rails 应用程序的 bin 文件夹中,我有一个脚本,用于轮询 gmail 帐户的收件箱以获取任何收到的邮件,但这条线imap = Net::IMAP.new(config[:host], config[:port], true )失败,没有将 Symbol 隐式转换为 Integer

这是脚本的快照形式

  #bin/mail_receiver.rb
  require File.join(File.dirname(File.expand_path(__FILE__)), '..', 'config', 'environment')
  require 'net/imap'
  require 'net/http'
  require 'rubygems'

  config = File.expand_path('../../config/initializers/load_imap_settings',  __FILE__)

  imap = Net::IMAP.new(config[:host], config[:port], true)

my_settings.yml在其他rails 配置之前加载到application.rb中,我已经在控制台中确认它们可用

#config/my_settings.yml
IMAP_HOST: 'imap.gmail.com'
IMAP_PORT: '993'
IMAP_USERNAME: 'xxxvvvyyy@gmail.com'
IMAP_PASSWORD: 'xxxvvvyyy'

然后我让它在初始化程序中可用,以便在之前粘贴的mail_receiver.rb脚本中使用

#config/initializers/load_imap_settings.rb
ImapSettings =  { 
  host:  ENV['IMAP_HOST'], 
  port:  ENV['IMAP_PORT'], 
  username: ENV['IMAP_USERNAME'], 
 password: ENV['IMAP_PASSWORD'] 
}

在 Rails 控制台中,我可以做

config = ImapSettings
config[:host]

这将返回

'imap.gmail.com'

类似地, config[:port]config[:username]config[:password]在rails 控制台中都返回正确的值而没有错误。

4

1 回答 1

1

File.expand_path在您的bin/mail_receiver.rb 中返回一串路径。此字符串分配给config变量,当您调用config[:host]config[:port]ruby​​ 时会引发错误no implicit conversion of Symbol into Integer (TypeError),因为它期望String那里([] 内部)应该是整数或范围等(您可以在那里查看文档http://ruby- doc.org/core-2.0.0/String.html#method-i-5B-5D)。

您应该从config/initializers/load_imap_settings.rb加载配置,require_relative然后将参数散列分配ImapSettingsconfing变量。您的代码(在bin/mail_receiver.rb中)可能是这样的:

require_relative '../../config/initializers/load_imap_settings'
config = ImapSettings
imap = Net::IMAP.new(config[:host], config[:port], true)
于 2013-09-19T14:09:29.903 回答