如何在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误认为是模板代码的开始,导致编译报错; - 转义后的
<%asm_group_unsubscribe_url%>是HTML实体,SendGrid只会识别原始的<%...%>格式标签,因此无法完成替换。
内容的提问来源于stack exchange,提问作者Arno
相关产品推荐
相关产品推荐

