我在Sinatra有一份工作联系表格。我现在正在尝试使用HTML模板发送电子邮件,但我无法使我的变量正常工作,它们只是以纯文本形式显示。这是代码。
# for contact form
def send_message
senders_name = params[:name]
senders_email = params[:email]
senders_message = params[:message]
Mail.deliver do
to 'me@mywebsite.com'
from senders_name + " <" + senders_email + ">"
subject 'Email from contact form on Website'
# body senders_message
html_part do
content_type 'text/html; charset=UTF-8'
body File.read('views/contact_form.erb')
end
end
end
On&#34; views / contact_form.erb&#34; ...
<html>
<head>
<title>pygo Contact Form</title>
</head>
<body>
<p>
Message from <strong><%= senders_name %></strong>
</p>
<p>
<%= senders_message %>
</p>
</body>
</html>
表格发送,一切正常,除非电子邮件发送时变量读作&#34;&lt;%= senders_name%&gt;&#34;而不是实际值。
答案 0 :(得分:2)
File.read
只返回文件的文字值,而不是ERB解析的版本。这就是为什么你在电子邮件正文中看到ERB标签而不是你想要的。
另外,这里有一个问题不是你的错。由于Mail.deliver
使用它自己的self
覆盖块的上下文以获得“方便”,因此您无法像通常应该那样访问实例变量或Sinatra方法。这就是你获得NoMethodError
。
解决这个问题的方法是将Sinatra模板渲染到Mail.deliver
块之外,并将变量作为本地传递,如下所示:
def send_message
senders_name = params[:name]
senders_email = params[:email]
senders_message = params[:message]
html_body = erb :contact_form, locals: { senders_name: senders_name, senders_message: senders_message }
Mail.deliver do
to 'me@mywebsite.com'
from senders_name + " <" + senders_email + ">"
subject 'Email from contact form on Website'
# body senders_message
html_part do
content_type 'text/html; charset=UTF-8'
body html_body
end
end
end