Ruby on rails gmaps4rails-现有标记不存在';在表单中放置新标记时,不会被清除

Ruby on rails gmaps4rails-现有标记不存在';在表单中放置新标记时,不会被清除,ruby-on-rails,ruby-on-rails-3,google-maps,gmaps4rails,Ruby On Rails,Ruby On Rails 3,Google Maps,Gmaps4rails,我有一个Rails 3.2应用程序,允许用户创建商店,我希望用户将他们的商店放在地图上。我尝试了gem,并通过使用默认配置使其工作——将用户输入的地址转换为坐标,并在地图上显示标记。然而,我发现转换过程的准确性不一致&我更喜欢让用户在地图上放置自己的标记 这是我在遵循gem自述之后的代码: # migration t.string "address", :null => false t.float "latitude" t.float "longitude" t.boolean

我有一个Rails 3.2应用程序,允许用户创建商店,我希望用户将他们的商店放在地图上。我尝试了gem,并通过使用默认配置使其工作——将用户输入的地址转换为坐标,并在地图上显示标记。然而,我发现转换过程的准确性不一致&我更喜欢让用户在地图上放置自己的标记

这是我在遵循gem自述之后的代码:

# migration
t.string  "address",  :null => false
t.float   "latitude"
t.float   "longitude"
t.boolean "gmaps"

# model Shop.rb
attr_accessible :name, :address, :latitude, :longitude

acts_as_gmappable

def gmaps4rails_address
  address
end

# shops_controller.rb
def show
  @shop = Shop.find(params[:id])
  @json = Shop.all.to_gmaps4rails
end

def edit
  @shop = Shop.find(params[:id])
  @json = Shop.all.to_gmaps4rails
end

def update
  @shop = Shop.find(params[:id])
  @json = Shop.all.to_gmaps4rails

  if @shop.update_attributes(params[:shop])
    flash[:success] = "Shop's updated."
    redirect_to shop_path(@shop)
  end
end

# view
<%= gmaps4rails(@json) %>
#迁移
t、 字符串“地址”,:null=>false
t、 浮动“纬度”
t、 浮动“经度”
t、 布尔“gmap”
#模型商店.rb
可访问属性:名称、地址、纬度、经度
可作为
def gmaps4rails_地址
地址
结束
#shops\u controller.rb
def秀
@shop=shop.find(参数[:id])
@json=Shop.all.to_gmaps4rails
结束
定义编辑
@shop=shop.find(参数[:id])
@json=Shop.all.to_gmaps4rails
结束
def更新
@shop=shop.find(参数[:id])
@json=Shop.all.to_gmaps4rails
如果@shop.update_属性(参数[:shop])
flash[:success]=“店铺已更新。”
重定向到店铺路径(@shop)
结束
结束
#看法
表格部分(参考gem的):

#_form.html.erb
....
var-markersArray=[];
//单击后,清除标记,放置新标记,更新表单中的坐标
Gmaps.map.callback=函数(){
google.maps.event.addListener(Gmaps.map.serviceObject,'click',函数(事件){
clearOverlays();
地点标记(事件标记);
更新formLocation(event.latLng);
});
};
//使用给定坐标更新表单属性
函数更新FormLocation(latLng){
$('#shop_attributes_latitude').val(latLng.lat());
$('#shop_attributes_longitude').val(latLng.lng());
$('#shop_attributes_gmaps_zoom').val(gmaps.map.serviceObject.getZoom());
}
//添加带有打开信息窗口的标记
功能定位标记(latLng){
var marker=new google.maps.marker({
位置:latLng,
地图:Gmaps.map.serviceObject,
德拉格布尔:是的
});
markersArray.push(marker);
//设置并打开信息窗口
var infowindow=new google.maps.infowindow({
内容:“太棒了!拖动我并调整缩放级别。

” }); 打开(Gmaps.map.serviceObject,marker); //听拖放 google.maps.event.addListener(标记'dragend',function(){ updateFormLocation(this.getPosition()); }); } //从地图中删除覆盖 函数clearOverlays(){ if(markersArray){ 对于(var i=0;i
问题:

  • 单击地图时,现有标记不会被清除。不过,它确实提供了一个新的标记
  • 单击submit按钮时,纬度和经度不会更新以反映新标记的新位置。它只是用旧的

更新

我设法让“更新标记位置”部分工作,但当在表单中单击地图时,现有标记仍未清除。显示页面上的结果只显示更新的标记,这很好

以下是更新的代码:

# Shop.rb
acts_as_gmappable :process_geocoding => false

# no more def gmaps4rails_address in the model

# controller
def show
  @json = Shop.find(params[:id]).to_gmaps4rails
end

def edit
  @json = Shop.find(params[:id]).to_gmaps4rails
end

def update
  @shop = Shop.find(params[:id])
  # @json = Shop.all.to_gmaps4rails # not needed here
  ...
end

# _form.html.erb
<%= gmaps4rails(@json) %>
<%= f.hidden_field :latitude %>
<%= f.hidden_field :longitude %>
<% content_for :scripts do %>
...
function updateFormLocation(latLng) {
  $('#shop_latitude').val(latLng.lat());
  $('#shop_longitude').val(latLng.lng());
  $('#shop_gmaps_zoom').val(Gmaps.map.serviceObject.getZoom());
}
...
#Shop.rb
作为可安装:进程地理编码=>false
#模型中不再有def gmaps4rails_地址
#控制器
def秀
@json=Shop.find(params[:id])到_gmaps4rails
结束
定义编辑
@json=Shop.find(params[:id])到_gmaps4rails
结束
def更新
@shop=shop.find(参数[:id])
#@json=Shop.all.to_gmaps4rails#此处不需要
...
结束
#_form.html.erb
...
函数更新FormLocation(latLng){
$('#shop_lation').val(latLng.lat());
$('#shop_longitude').val(latLng.lng());
$('#shop_gmaps_zoom').val(gmaps.map.serviceObject.getZoom());
}
...

我想您应该简单地替换:

markersArray[i].setMap(null);
与:


markersArray[i].setMap(空)-当我在浏览器中转到编辑表单时,它会显示当前标记。单击地图会给我一个新标记,但不会删除旧标记。在地图上第二次单击会替换“新”标记,但仍不会删除“旧”标记。但是使用
markersArray[i].serviceObject.setMap(null)它禁止第二次单击地图以清除“新建”标记。我目前正在重写gem的js部分,我应该澄清很多事情。@apheading这个问题最终解决了吗?我也陷入了同样的境地。谢谢
markersArray[i].setMap(null);
markersArray[i].serviceObject.setMap(null);