Rails中如何移除GeoJSON循环生成时的最后一个逗号?
嘿,这个问题我之前做地图项目时可太熟悉了!GeoJSON本质还是JSON,对格式要求特别严格,多一个逗号直接就会导致解析失败,给你几个实用的解决办法:
方法一:用Ruby的map + join(最简洁)
这个方法是我平时最常用的,把每个POI转换成对应的Feature字符串,再用逗号把它们拼接起来,自动避免最后一个元素后面的逗号:
{ "type": "FeatureCollection", "features": [ <%= @pois.map do |poi| %> { "type": "Feature", "geometry": { "type": "Point", "coordinates": [<%= poi.longitude %>, <%= poi.latitude %>] } } <% end.join(', ') %> ] }
原理很简单:map遍历所有POI,把每个都转成Feature的JSON片段字符串,join(', ')会在每两个片段之间插入逗号,最后一个片段自然就不会带尾巴了。
方法二:用ERB条件判断控制逗号
如果你的Feature结构比较复杂,不想用map,可以直接在循环里判断当前POI是不是最后一个,只有不是最后一个时才输出逗号:
{ "type": "FeatureCollection", "features": [ <% @pois.each do |poi| %> { "type": "Feature", "geometry": { "type": "Point", "coordinates": [<%= poi.longitude %>, <%= poi.latitude %>] } }<%= ', ' unless poi == @pois.last %> <% end %> ] }
注意:如果你的@pois里存在完全相同的实例(比如重复的记录),这个判断可能会出问题,但一般POI都是唯一的数据库记录,所以不用担心。
方法三:让Rails帮你序列化(最规范)
手动拼接JSON很容易出错,不如在控制器里先把数据处理成GeoJSON结构,再用Rails的to_json方法序列化,这样完全不用管逗号的问题:
控制器代码
# 在对应的controller action里 @features = @pois.map do |poi| { type: "Feature", geometry: { type: "Point", coordinates: [poi.longitude, poi.latitude] } } end @geojson = { type: "FeatureCollection", features: @features }.to_json
ERB模板代码
<%= @geojson.html_safe %>
这个方法最靠谱,既避免了手动拼接的错误,html_safe还能防止XSS问题,而且Rails的JSON序列化会严格遵守格式规范,绝对不会出现多余逗号。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

