HTML 电子邮件模板中的 Sinatra 变量
Sinatra Variables in HTML Email Template
我在 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
在 "views/contact_form.erb"...
<html>
<head>
<title>pygo Contact Form</title>
</head>
<body>
<p>
Message from <strong><%= senders_name %></strong>
</p>
<p>
<%= senders_message %>
</p>
</body>
</html>
表单发送并且一切正常,除了发送电子邮件时变量读取为“<%= senders_name %>”而不是实际值。
File.read
只会 return 文件的字面值,而不是 ERB 解析的版本。这就是为什么您在电子邮件正文中看到的是 ERB 标签,而不是您想要的。
此外,这里有一个问题不是你的错。由于 Mail.deliver
用它自己的 self
为 "convenience" 覆盖块上下文的方式,您不能像通常那样访问实例变量或 Sinatra 方法。这就是为什么你得到 NoMethodError
.
解决这个问题的方法是在 Mail.deliver
块之外呈现 Sinatra 模板,并将变量作为本地变量传递,如下所示:
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
我在 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
在 "views/contact_form.erb"...
<html>
<head>
<title>pygo Contact Form</title>
</head>
<body>
<p>
Message from <strong><%= senders_name %></strong>
</p>
<p>
<%= senders_message %>
</p>
</body>
</html>
表单发送并且一切正常,除了发送电子邮件时变量读取为“<%= senders_name %>”而不是实际值。
File.read
只会 return 文件的字面值,而不是 ERB 解析的版本。这就是为什么您在电子邮件正文中看到的是 ERB 标签,而不是您想要的。
此外,这里有一个问题不是你的错。由于 Mail.deliver
用它自己的 self
为 "convenience" 覆盖块上下文的方式,您不能像通常那样访问实例变量或 Sinatra 方法。这就是为什么你得到 NoMethodError
.
解决这个问题的方法是在 Mail.deliver
块之外呈现 Sinatra 模板,并将变量作为本地变量传递,如下所示:
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