我是Ruby的新手,想知道为什么我在这种情况下使用简单的Sinatra应用程序中的'mail'gem获得错误:
post "/email/send" do
@recipient = params[:email]
Mail.deliver do
to @recipient # throws error as this is undefined
from 'server@domain.com'
subject 'testing sendmail'
body 'testing sendmail'
end
erb :email_sent
end
Run Code Online (Sandbox Code Playgroud)
然而,这工作正常:
post "/email/send" do
Mail.deliver do
to 'me@domain.com'
from 'server@domain.com'
subject 'testing sendmail'
body 'testing sendmail'
end
erb :email_sent
end
Run Code Online (Sandbox Code Playgroud)
我怀疑这与块范围和我对它的误解有关.
Dan*_*nov 14
正如Julik所说,使用Mail#delivery执行你的块#instance_exec,它只是self在运行一个块时更改(否则你将无法调用方法#to和#from块内).
你在这里真正可以做的是使用块是闭包的事实.这意味着它"记住"它周围的所有局部变量.
recipient = params[:email]
Mail.deliver do
to recipient # 'recipient' is a local variable, not a method, not an instance variable
...
end
Run Code Online (Sandbox Code Playgroud)
再简单地说:
self #instance_exec改变了self;self块并且被块记住,因为块是闭包.the*_*Man 10
如果您仔细阅读文档,Mail您将找到一个可行的替代解决方案.而不是使用:
Mail.deliver do
to @recipient # throws error as this is undefined
from 'server@domain.com'
subject 'testing sendmail'
body 'testing sendmail'
end
Run Code Online (Sandbox Code Playgroud)
你可以使用Mail的new()方法,传入参数,并忽略块:
Mail.new(
to: @recipient,
from: 'server@domain.com',
subject: 'testing sendmail',
body: 'testing sendmail'
).deliver!
Run Code Online (Sandbox Code Playgroud)
或备用哈希元素定义:
Mail.new(
:to => @recipient,
:from => 'server@domain.com',
:subject => 'testing sendmail',
:body => 'testing sendmail'
).deliver!
Run Code Online (Sandbox Code Playgroud)
在pry,或irb你会看到:
pry(main)> Mail.new(
pry(main)* to: 'me@domain.com',
pry(main)* from: 'me@' << `hostname`.strip,
pry(main)* subject: 'test mail gem',
pry(main)* body: 'this is only a test'
pry(main)* ).deliver!
=> #<Mail::Message:59273220, Multipart: false, Headers: <Date: Fri, 28 Oct 2011 09:01:14 -0700>, <From: me@myhost.domain.com>, <To: me@domain.com>, <Message-ID: <4eaad1cab65ce_579b2e8e6c42976d@myhost.domain.com>>, <Subject: test mail gem>, <Mime-Version: 1.0>, <Content-Type: text/plain>, <Content-Transfer-Encoding: 7bit>>
Run Code Online (Sandbox Code Playgroud)
该new方法有几种可以使用的变体.这也来自文档,可能会更好:
作为旁注,您还可以通过直接创建Mail :: Message对象,然后通过字符串,符号或直接方法调用传递值来创建新电子邮件.有关更多信息,请参阅Mail :: Message.
mail = Mail.new
mail.to = 'mikel@test.lindsaar.net'
mail[:from] = 'bob@test.lindsaar.net'
mail['subject'] = 'This is an email'
mail.body = 'This is the body'
Run Code Online (Sandbox Code Playgroud)
接着是mail.deliver!.
另请注意,在前面的示例中,有多种方法可以访问邮件信封中的各种标头.这是一个灵活的宝石,似乎经过深思熟虑,很好地遵循Ruby方式.
| 归档时间: |
|
| 查看次数: |
867 次 |
| 最近记录: |