将变量传递给块 - Rails

Kat*_*e H 5 ruby ruby-on-rails

在我的rails应用程序中,我使用此gem与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!
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

An SMTP To address is required to send a message. Set the message smtp_envelope_to, to, cc, or bcc address.
Run Code Online (Sandbox Code Playgroud)

电子邮件变量无法传递到块中.是什么造成的?如何传递动态电子邮件地址?

Mer*_*ian 7

我确定它发生是因为@email是一个实例变量,绑定到self(有点等于self.email).并且gmail模块可以self使用像instance_eval或者class_eval所谓的"范围门"之类的方法轻松更改内部块.这是红宝石元编程的常规功能.

只需使用一个简单的变量,它就会被延续捕获.

email_to = params[:email]
email = gmail.compose do
    to email_to
    ...
end
Run Code Online (Sandbox Code Playgroud)

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

  • `params`不是变量,它是一个基本控制器的方法(`ActionController`?),所以它也绑定到`self`并且在块内无法访问. (3认同)
  • 嗯,奇怪,那运气不好.但是,在块内部检查`self.class`和`self.inspect`. (2认同)