Ruby on rails 使用谷歌地图将多边形坐标保存到数据库
我正在尝试使用google maps DrawingManager将一些多边形坐标保存到Rails应用程序中的Postgres数据库中。我成功地显示了多边形和坐标,但是当我保存项目时,我在数据库行中得到的坐标是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
“”
我在表中使用了一个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