将变量传递到块中 - Rails

5

在我的Rails应用程序中,我使用这个宝石来与Gmail API交互:https://github.com/gmailgem/gmail

以下是我在发送电子邮件方法中的代码:

gmail = Gmail.connect(params[:email], params[:password])
@email = params[:email]

email = gmail.compose do
  to @email
  subject "Having fun in Puerto Rico!"
  body "Spent the day on the road..."
end
email.deliver!

我收到了这个错误:
An SMTP To address is required to send a message. Set the message smtp_envelope_to, to, cc, or bcc address.

为什么电子邮件变量无法传递到块中?如何传入动态电子邮件地址?


1
@email 有任何值吗?它是空的还是 nil? - Wand Maker
1
在传递到块之前,@email具有一个值,在块内部,它最终具有nil的值。 - Katie H
1个回答

7

我相信这是因为@email是一个实例变量,绑定到self (与self.email有些相同)。并且gmail模块可以轻松地使用像instance_evalclass_eval等方法在块内部更改self,所谓的“范围门”。这是 Ruby 元编程的常规特性。

只需使用一个简单的变量,它将被 continuation 捕获。

email_to = params[:email]
email = gmail.compose do
    to email_to
    ...
end

我强烈建议不要把实例变量用作临时变量 - 它们代表对象的状态。使用局部变量,这就是它们设计的目的。


这个方法在我的控制器里。我刚刚尝试了一下,它给了我完全相同的错误。 - Katie H
当我尝试传递params[:email]时,我会得到这个错误:undefined local variable or method `params' for #<Mail::Message:70204364613700, Multipart: false, Headers: > - Katie H
2
好吧,很奇怪,那就不走运了。但是,在块内部仍然要检查self.classself.inspect - Meredian
3
params 不是一个变量,它是一些基本控制器(例如 ActionController)的方法,因此它也绑定到 self 上,并且在块内不可访问。 - Meredian
非常感谢你!!!:))) - Katie H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接