You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:13:54