Ruby on Rails与JS:如何根据JSON的toll值控制谷歌地图标记显示?
解决JSON字符串布尔值的判断问题
嘿,我懂你遇到的困扰了!问题出在后端返回的toll是字符串类型的"true"/"false",但你用布尔值true去做比较,JavaScript的类型转换规则在这里坑了你。
为什么原来的判断不生效?
在JS里,当你用==比较字符串和布尔值时,会触发隐式类型转换:
- 布尔值
true会被转换成数字1 - 字符串
"true"尝试转换成数字时会得到NaN - 最后
NaN == 1的结果是false,所以你的条件永远不会成立,标记自然加不上。
前端层面的快速解决方案
直接和字符串值做比较,推荐用严格相等===(避免意外的类型转换):
if (pis.toll === "true") { addMarker(this); }
如果想让代码可读性更好,可以先把字符串转成布尔值再判断:
const hasToll = pis.toll === "true"; if (hasToll) { addMarker(this); }
后端层面的优化方案(更优雅)
如果可以修改Ruby on Rails控制器,直接把toll字段转换成布尔类型返回,这样前端就能用原来的布尔值判断逻辑了:
- 如果你用序列化器(比如Active Model Serializers),可以指定字段类型:
class YourModelSerializer < ActiveModel::Serializer attribute :toll, type: :boolean end
- 如果直接在控制器里构造JSON,可以手动转换:
def your_action data = YourModel.all.map do |item| # 假设数据库里toll是字符串类型,转成布尔值 item.attributes.merge(toll: item.toll == "true") end render json: data end
这样前端拿到的JSON里toll就是真正的布尔值true/false,原来的if (pis.toll == true)就能正常工作了。
内容的提问来源于stack exchange,提问作者Felipe Marcon
相关产品推荐
相关产品推荐

