Rails Action Mailer变量传递HTML代码显示异常问题求助
Ruby on Rails Action Mailer 问题解答
一、让变量中的HTML代码正常渲染
Rails的ERB模板里,<%= %>默认会自动转义HTML内容(防止XSS攻击),这就是你看到@template被转义成<h1>wait what ?</h1>的原因。解决方式有两种:
- 在视图层用
raw方法标记内容安全:
修改newsletter.html.erb模板:
<%= raw @template %> <h1>wait what ?</h1>
- 在控制器层给字符串添加
html_safe标记:
修改newsletter方法:
def newsletter @template = "<h1>wait what ?</h1>".html_safe mail(to: "email@test.com", subject: "test de newsletter") end
两种方式效果一致,选哪种取决于你想在哪一层控制内容的安全性。
二、上传整个文件作为模板
可以实现上传文件作为邮件模板,但要注意安全风险(未过滤的ERB模板可能执行恶意代码),具体实现如下:
方法1:渲染上传的ERB文件内容
如果用户上传的是完整的.html.erb模板文件,可读取内容后用ERB引擎渲染:
def newsletter # 替换为实际的上传文件存储路径 uploaded_template_path = Rails.root.join("tmp", "uploaded_newsletter.html.erb") template_content = File.read(uploaded_template_path) # 绑定控制器上下文,让模板能调用实例变量 rendered_html = ERB.new(template_content).result(binding) mail( to: "email@test.com", subject: "test de newsletter", body: rendered_html, content_type: "text/html" ) end
方法2:用Rails模板查找机制渲染
如果上传文件放在Rails模板目录(比如app/views/mailer/),可直接用render指定文件:
def newsletter mail(to: "email@test.com", subject: "test de newsletter") do |format| format.html { render file: "path/to/uploaded_template.html.erb" } end end
注意:要确保上传路径在Rails允许的模板查找范围内,且严格校验文件内容,避免代码注入风险。
内容的提问来源于stack exchange,提问作者rogerino
相关产品推荐
相关产品推荐

