You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails Action Mailer变量传递HTML代码显示异常问题求助

Ruby on Rails Action Mailer 问题解答

一、让变量中的HTML代码正常渲染

Rails的ERB模板里,<%= %>默认会自动转义HTML内容(防止XSS攻击),这就是你看到@template被转义成&lt;h1&gt;wait what ?&lt;/h1&gt;的原因。解决方式有两种:

  1. 在视图层用raw方法标记内容安全:
    修改newsletter.html.erb模板:
<%= raw @template %>
<h1>wait what ?</h1>
  1. 在控制器层给字符串添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:40:45