【问题标题】:Rails Jquery js.erb not reading my instance variables to make comparisonRails Jquery js.erb 没有读取我的实例变量进行比较
【发布时间】:2014-09-11 23:50:31
【问题描述】:
我正在传递一个变量@tagging_done,它是真还是假。当我放一个 binding.pry 时,我可以看到变量在那里并且确实有一个值。
- 当我使用 tagging_done === true 甚至 tagging_done == true 检查它是否返回 true 时,它告诉我它返回 true,但我从未达到逻辑的真实部分。
- 当我将其更改为 true == true 时,它当然会正确执行。
.js.erb
var tagging_done = "<%=@tagging_done%>";
if (tagging_done === true) {
alert("here");
} else {
alert("no here");
}
有什么建议吗?
【问题讨论】:
标签:
javascript
jquery
ruby-on-rails-4
erb
【解决方案1】:
我相信您是直接发送您的 .js.erb,即。不是来自您设置 @tagging_done 变量的控制器。在我看来,你应该这样做:
<script>js_call("<%=@tagging_done%>");</script>
来自您的 .html.erb 模板,并在 .js.erb 中将内容封装在一个函数中:
function tagging_done() {
if (tagging_done === true) {
alert("here");
} else {
alert("no here");
}
}
还有一些问题,例如可能发生 XSRF/XSS 攻击(尝试在发送前将值转换为布尔值),如下所示:
<script>js_call(<%=!!@tagging_done%>);</script>
!! 不是运算符。它是一个运算符!(即否定)应用了两次,这是将任意值转换为布尔值的常用习惯。
另一件事是,您需要确保在加载 javascript 后以 html 代码调用您的 js。如果你使用 jquery(你可能会这样做),你可以在整个 DOM 树准备好后以一种非常简单的方式推迟它的执行:
<script>$(function(){js_call(<%=!!@tagging_done%>);});</script>