构建GeoJSON时show方法报undefined method '+'错误求助
问题原因与解决方案
这问题我太熟悉了!咱们先把问题拆明白:
核心错误原因
你遇到的undefined method '+' for #<Hash>,本质是数据类型不匹配:
- 在
index方法里,pois_geojson和tracks_geojson通过map返回的是数组(每个元素是一个Feature Hash),Ruby数组支持用+来拼接两个数组,所以运行正常; - 但在
show方法里,poi_geojson和track_geojson返回的是单个Hash对象,而Ruby的Hash类根本没有定义+运算符,直接用+自然就报错了。
另外还有个隐藏的小问题:你的poi_geojson方法的Hash写法有语法错误!直接把RGeo::GeoJSON.encode(@poi.lonlat)丢进Hash里,没有指定对应的key,这会导致生成的Hash结构不符合GeoJSON规范(每个Feature必须包含geometry字段),后续前端解析也会出问题。
具体解决方法
1. 修复Hash拼接的问题
把单个Feature Hash放进数组里,再组成FeatureCollection的features数组。你可以直接用数组字面量,比用+更直观:
def show ... respond_to do |format| format.html format.json { render json: { type: 'FeatureCollection', features: [poi_geojson, track_geojson] } } end end
这样features字段就是一个包含两个Feature的数组,完全符合GeoJSON的FeatureCollection规范。
2. 修复poi_geojson的语法错误
给RGeo::GeoJSON.encode(@poi.lonlat)加上geometry:键,和track_geojson保持一致的结构:
def poi_geojson { type: 'Feature', geometry: RGeo::GeoJSON.encode(@poi.lonlat), # 这里补上geometry键 properties: { name: @poi.name, :'marker-color' => '#00607d', :'marker-symbol' => 'circle', :'marker-size' => 'medium' } } end
验证一下
修改完成后,你可以在rails控制台里测试:
- 调用
poi_geojson,检查返回的Hash是否包含type、geometry、properties三个字段; - 访问对应的show接口的JSON格式,看看返回的FeatureCollection结构是否合法。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

