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

如何在ActionMailer的ERB模板中输出原始<% foo %>及SendGrid标签?

在ActionMailer的ERB模板中输出SendGrid原始标签的正确方法

我们在实现SendGrid退订组功能时,需要在邮件模板中保留<%asm_group_unsubscribe_url%>这类原始标签,让SendGrid后续完成替换。但直接编写会被ERB解析,转义后又无法被SendGrid识别,之前尝试的<%= raw("<%asm_group_unsubscribe_url%>") %>还会导致编译失败。以下是几种可行的解决方案:

方法1:使用ERB的<%== %>原生语法

Rails的ERB支持<%==语法,它等价于<%= raw(...) %>,且能避免字符串内的ERB标记被提前解析:

<%== '<%asm_group_unsubscribe_url%>' %>

这里用单引号包裹标签内容,防止ERB把内部的<%当成模板代码的起始标记。

方法2:通过实例变量传递标签内容

在你的ActionMailer邮件方法中定义实例变量,把SendGrid标签存入变量:

# app/mailers/your_mailer.rb
class YourMailer < ApplicationMailer
  def unsubscribe_notification
    @sendgrid_unsubscribe_tag = '<%asm_group_unsubscribe_url%>'
    mail(to: recipient_email, subject: 'Manage your subscriptions')
  end
end

然后在ERB模板中用raw输出变量:

<%= raw @sendgrid_unsubscribe_tag %>

这种方式能让ERB完全忽略变量内部的内容,直接输出原始字符串。

方法3:使用html_safe标记字符串为安全

直接对字符串调用html_safe方法,告诉Rails不需要转义该内容:

<%= '<%asm_group_unsubscribe_url%>'.html_safe %>

为什么之前的方法失效?

  • 用raw("<%asm_group_unsubscribe_url%>")时,双引号内的<%会被ERB误认为是模板代码的开始,导致编译报错;
  • 转义后的&lt;%asm_group_unsubscribe_url%&gt;是HTML实体,SendGrid只会识别原始的<%...%>格式标签,因此无法完成替换。

内容的提问来源于stack exchange,提问作者Arno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:30:37