咨询Slim模板编写JS格式响应的更优实现方式
解决Slim模板输出JS响应的简洁方案
嘿,我完全懂你的困扰——用Slim写JS响应时被自动套上<script>标签导致代码跑不起来,现有写法加新命令又繁琐,明明核心就3行替换HTML的逻辑对吧?其实有个更清爽的解决思路,能让你写JS代码像在普通JS文件里一样顺畅:
核心要点:先设置正确的响应类型
Slim默认会把内容当成HTML处理,所以才会自动给你的JS套上<script>标签。只要先告诉它我们要输出纯JS响应,这个问题就解决了:
content_type :js
简洁写法:用javascript:过滤器
设置好响应类型后,直接用Slim的javascript:过滤器写你的代码就行,它会帮你处理转义(比如插入Ruby变量时),而且输出的就是纯JS,不会带多余标签:
content_type :js javascript: // 这里直接写你的3行替换HTML代码 const targetEl = document.getElementById('your-target-id'); targetEl.innerHTML = '<div>替换后的新内容</div>'; targetEl.classList.add('updated');
要加新命令?直接在过滤器下面换行写就行,跟写普通JS文件没区别,完全不用繁琐的操作。
动态插入Ruby变量也没问题
如果需要把后端变量传到JS里,用Slim的插值语法配合j方法(自动转义HTML特殊字符)就行:
content_type :js - dynamic_content = @page.content javascript: const newContent = '#{j(dynamic_content)}'; document.getElementById('target').innerHTML = newContent;
更极简的写法(适合短代码)
如果你的JS代码特别短,甚至可以不用过滤器,直接输出字符串:
content_type :js "document.getElementById('target').innerHTML = '#{j(@new_content)}';"; "document.getElementById('target').classList.add('active');";
不过这种方式可读性不如过滤器,更适合几行以内的代码。
总的来说,先设置content_type :js,再用javascript:过滤器写代码,是最优雅也最易扩展的方案——既解决了<script>标签的问题,添加新逻辑也跟写普通JS一样顺手。
内容的提问来源于stack exchange,提问作者Chen Kinnrot
相关产品推荐
相关产品推荐

