1

我有这个用于配置邮件 gem 的块。

Mail.defaults do 
  retriever_method :imap, :address    => @mail_settings[:address],
                          :port       => @mail_settings[:port],
                          :user_name  => @mail_settings[:username], 
                          :password   => @mail_settings[:password],
                          :enable_ssl => @mail_settings[:enable_ssl]   
end

@mail_settings 是可访问的,可以在 do 块之外读取,但不能在内部读取。我对红宝石很陌生,所以我试图理解为什么。现在,我收到了这个错误(第 66 行是retriever_method 行):

main.rb:66:in `block in set_mail_defaults': undefined method `[]' for nil:NilClass (NoMethodError)

奇怪的是,这有效:

address     = @mail_settings[:address]
port        = @mail_settings[:port]
user_name   = @mail_settings[:username]
password    = @mail_settings[:password]
enable_ssl  = @mail_settings[:enable_ssl]

Mail.defaults do 
  retriever_method :imap, :address    => address,
                          :port       => port, 
                          :user_name  => user_name,  
                          :password   => password,
                          :enable_ssl => enable_ssl   
end
4

2 回答 2

1

Mail.defaults 正在instance_eval块上运行(源代码)。这意味着您查找的任何实例变量都将位于用作块实例的对象中。要解决此问题,请将实例变量的值分配给局部变量。

于 2013-07-20T06:34:22.213 回答
1

Mail.defaults方法定义如下:

def self.defaults(&block)
    Configuration.instance.instance_eval(&block)
end

这意味着它评估单例实例(Configuration包括Singleton模块)中的块,该块Configuration不是您正在使用的类的上下文和@mail_settings所在的位置。

为了克服这个问题,您可以定义一个要保存的局部变量,@mail_settings以便您可以在块内访问它:

m = @mail_settings
Mail.defaults do 
  retriever_method :imap, :address    => m[:address],
                          :port       => m[:port],
                          :user_name  => m[:username], 
                          :password   => m[:password],
                          :enable_ssl => m[:enable_ssl]   
end
于 2013-07-20T17:38:35.250 回答