如何在.slim文件的JavaScript函数中使用Rails条件判断?
修正Slim中根据Rails环境切换Zendesk域名的JS代码
首先,你当前的三元运算符写法有语法问题,而且在Slim模板里嵌入Ruby逻辑的方式需要调整一下——不过你的思路是完全可行的,确实可以通过Rails环境判断来动态生成对应的Zendesk域名,下面是修正后的完整代码:
javascript: function zopimChat() { window.zEmbed || function (e, t) { var n, o, d, i, s, a = [], r = document.createElement("iframe"); window.zESettings = { webWidget: { offset: { vertical: "85px" } } }; window.zEmbed = function () { a.push(arguments) }, window.zE = window.zE || window.zEmbed, r.src = "javascript:false", r.title = "", r.role = "presentation", (r.frameElement || r).style.cssText = "display: none", d = document.getElementsByTagName("script"), d = d[d.length - 1], d.parentNode.insertBefore(r, d), i = r.contentWindow, s = i.document; try { o = s } catch (c) { n = document.domain, r.src = 'javascript:var d=document.open();d.domain="' + n + '";void(0);', o = s } o.open()._l = function () { var o = this.createElement("script"); n && (this.domain = n), o.id = "js-iframe-async", o.src = e, this.t = +new Date, this.zendeskHost = t, this.zEQueue = a, this.body.appendChild(o) }, o.write('<body onload="document._l();">'), o.close() } // 修正后的环境判断逻辑 ("https://assets.zendesk.com/embeddable_framework/main.js", #{Rails.env.production? ? '"testwebsite.zendesk.com"' : '"testwebsite-staging.zendesk.com"'}); }
关键修正点说明:
- 在Slim的JavaScript块中,要嵌入Ruby代码(比如
Rails.env判断),需要用#{}包裹,这样Slim在渲染模板时会先执行Ruby逻辑,生成对应的JavaScript字符串,确保客户端拿到的是适配当前环境的代码。 - 原代码的三元运算符缺少
?导致语法错误,现在补上标准的三元语法条件 ? 真值 : 假值,同时把判断结果生成带引号的字符串,保证最终输出的JS语法合法。
验证与扩展建议:
你可以在不同环境下启动Rails服务,查看页面的HTML源码,检查生成的JavaScript代码里的Zendesk域名是否符合预期——生产环境应该是testwebsite.zendesk.com,其他环境则是testwebsite-staging.zendesk.com。
如果你的预发布环境有单独的环境标识(比如staging),也可以把判断逻辑改成更精准的多环境分支,比如:
#{Rails.env.production? ? '"testwebsite.zendesk.com"' : Rails.env.staging? ? '"testwebsite-staging.zendesk.com"' : '"testwebsite-dev.zendesk.com"'}
这样就能覆盖开发、预发布、生产等多环境的切换需求了。
内容的提问来源于stack exchange,提问作者seanberlin
相关产品推荐
相关产品推荐

