RoR生成器模板字符转义:如何输出原生ERB标签为纯文本
解决Rails生成器模板输出原生ERB标签的问题
我来帮你搞定这个问题——这在Rails生成器模板里是个常见的坑:当你想让模板输出原生的ERB标签(比如<%#和<%=),而不是让当前模板的ERB引擎把它们当成指令执行时,必须对这些特殊标签进行转义处理。
问题根源
你的模板文件本身是ERB格式(template.js.erb),所以:
- 模板里的
<%#会被当作当前模板的注释,导致这行内容不会输出到目标文件里; - 嵌套的
<%= plural_table_name %>会触发语法错误——ERB引擎会尝试解析整个<%= smart_listing_update :<%= plural_table_name %> %>,这显然不符合Ruby语法规则。
解决方案:转义ERB标签
Rails ERB支持用<%%来转义<%,直接修改你的模板文件即可:
<%%# Render list for XHR requests %> <%%= smart_listing_update :<%= plural_table_name %> %>
逐行解释:
- 第一行的
<%%#会被ERB引擎解析为<%#,最终输出到目标文件的就是<%# Render list for XHR requests %>,不会被当作模板注释; - 第二行的
<%%=会被解析为<%=,而<%= plural_table_name %>是当前模板的动态变量,会被替换为实际的表名复数(比如projects),最终输出到目标文件的就是<%= smart_listing_update :projects %>。
替代方案:字符串输出
如果你觉得转义符号看起来有点混乱,也可以用字符串包裹的方式输出原生ERB标签,通过Ruby字符串插值注入动态变量:
<%= '<%# Render list for XHR requests %>' %> <%= "<%= smart_listing_update :#{plural_table_name} %>" %>
这种方式的原理是让当前模板的ERB引擎执行<%= %>输出字符串,而字符串里的内容会原样保留为目标文件的原生ERB标签。
两种方法都能解决你的问题,推荐第一种<%%转义的方式,它更符合Rails生成器模板的惯用写法,也更简洁。
内容的提问来源于stack exchange,提问作者Jan Krupa
相关产品推荐
相关产品推荐

