Ruby on rails 使用谷歌地图将多边形坐标保存到数据库

Ruby on rails 使用谷歌地图将多边形坐标保存到数据库,ruby-on-rails,Ruby On Rails,我正在尝试使用google maps DrawingManager将一些多边形坐标保存到Rails应用程序中的Postgres数据库中。我成功地显示了多边形和坐标,但是当我保存项目时,我在数据库行中得到的坐标是“” 我在表中使用了一个json列。我不确定这是否是最好的方法 Javascript function initMap() { var map = new google.maps.Map(document.getElementById("map"), { cente

我正在尝试使用google maps DrawingManager将一些多边形坐标保存到Rails应用程序中的Postgres数据库中。我成功地显示了多边形和坐标,但是当我保存项目时,我在数据库行中得到的坐标是
“”

我在表中使用了一个json列。我不确定这是否是最好的方法

Javascript

function initMap() {
 var map = new google.maps.Map(document.getElementById("map"), {
 center: { lat: -30.2266, lng: 149.4455 },
 zoom: 8
});
        
 var polyOptions = {
  strokeWeight: 0,
  fillOpacity: 0.45,
  editable: true,
  draggable: true 
 };

 var drawingManager = new google.maps.drawing.DrawingManager({
  drawingMode: google.maps.drawing.OverlayType.POLYGON,
  drawingControlOptions: {
  position: google.maps.ControlPosition.TOP_CENTER,
    drawingModes: ["polygon"]
  },
 markerOptions: {
  draggable: true
 },
 polylineOptions: {
  editable: true,
  draggable: true
 }
});
 google.maps.event.addListener(drawingManager, 'overlaycomplete', function (e) {
  if (e.type !== google.maps.drawing.OverlayType.MARKER) {
    drawingManager.setDrawingMode(null);
    var newShape = e.overlay;
    newShape.type = e.type;
    google.maps.event.addListener(newShape, 'click', function (e) {
      if (e.vertex !== undefined) {
       if (newShape.type === google.maps.drawing.OverlayType.POLYGON) {
       var path = newShape.getPaths().getAt(e.path);
       path.removeAt(e.vertex);
       if (path.length < 3) {
        newShape.setMap(null);
      }
     }
     if (newShape.type === google.maps.drawing.OverlayType.POLYLINE) {
      var path = newShape.getPath();
      path.removeAt(e.vertex);
       if (path.length < 2) {
       newShape.setMap(null);
       }
      }
      }
      setSelection(newShape);
      });
     }
    var coords = e.overlay.getPath().getArray();
    console.log("POLY:" + coords.toString());
    var div = document.getElementById('info');
    div.innerHTML += "[" + coords + "]";
  });
 }
模式

create_table "properties", force: :cascade do |t| 
 t.string "name"
 t.json "coordinates"
 t.datetime "created_at", precision: 6, null: false
 t.datetime "updated_at", precision: 6, null: false
end

正如rmlockerd所说,确保您允许控制器中的参数:

params.require(:property).permit(映射坐标:[])

我认为将它们存储为数组并不好,您应该将它们作为散列发送并将其转换为json。(如果您使用的是PSQL,那么jsonb更有效)


此外,在JS中,您并没有将隐藏字段标记的值设置为任何值,您只是将HTML添加到其中。您应该将坐标设置为字段的
value()

您可以发布
create
控制器方法的完整代码以及控制器上允许的参数吗?我已经发布了完整的create方法。真的是标准方法。谢谢@askprod。我忘了添加require参数和值。我有:map_coords而不是map_coords:[],并在javascript中将值设置为接受到隐藏的_字段_标记中。
def create
    @property = Property.new(property_params)
    @property.coordinates = params[:map_coords]

    respond_to do |format|
      if @property.save
        format.html { redirect_to @property, notice: 'Property was successfully created.' }
        format.json { render :show, status: :created, location: @property }
      else
        format.html { render :new }
        format.json { render json: @property.errors, status: :unprocessable_entity }
      end
    end
  end
create_table "properties", force: :cascade do |t| 
 t.string "name"
 t.json "coordinates"
 t.datetime "created_at", precision: 6, null: false
 t.datetime "updated_at", precision: 6, null: false
end