无法为表单中的隐藏字段设置值

时间:2013-02-22 16:25:34

标签: javascript ruby-on-rails-3

我试图在Rails 3中为表单中的隐藏字段设置一个值。

但是当我将表单提交到我的数据库时,没有为这些字段编写任何内容。

有我的JS:

function getGeocode() {
geocoder = new google.maps.Geocoder();
var street = $("#player_street").val()
var postalcode = $("#player_postalcode").val()
var city = $("#player_city").val()
var address = street + ", " + postalcode + ", " + city
var lat
var lng
//console.log(address)

geocoder.geocode( { 'address': address}, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {
    lat = results[0].geometry.location.hb
    lng = results[0].geometry.location.ib
    $("#player_lat").val(lat)
    $("#player_lng").val(lng)
    return true
  } else {
    return false
    alert("Dein Player konnte nicht eingetragen werden, bitte probiere es noch einmal.");
  }
})
}

当我将getGeocode()的returnvalue变为false时,隐藏字段的值会被设置。但是当我将returnvalue设置为true时,没有数据库的条目。

字段已设置并在模型中工作,函数由form_for帮助程序的onsubmit方法访问。

有人知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

由于您使用jQuery使用:hidden jQuery选择器。

var street = $("#player_street:hidden").val()

http://api.jquery.com/hidden-selector/

答案 1 :(得分:0)

geocoder.geocode( ...

是异步功能。因此,它会在一段时间后收到响应并为字段设置值,而getGeocode()函数的其余代码将继续运行。

如果在函数中返回true,则在地理编码器返回结果之前提交表单。如果您返回false,则会取消提交并设置值。

所以你需要在回调中提交数据,例如:

$(#the_form_id).submit( function() {

  geocoder = new google.maps.Geocoder();
  var street = $("#player_street").val()
  var postalcode = $("#player_postalcode").val()
  var city = $("#player_city").val()
  var address = street + ", " + postalcode + ", " + city
  var lat
  var lng


  geocoder.geocode( { 'address': address}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      lat = results[0].geometry.location.hb
      lng = results[0].geometry.location.ib
      $("#player_lat").val(lat)
      $("#player_lng").val(lng)
      $(#the_form_id).unbind('submit').submit();
    } else {
      return false
      alert("Dein Player konnte nicht eingetragen werden, bitte probiere es noch einmal.");
    }
  });
  return false;
})

答案 2 :(得分:0)

为防止提交方法,我添加了ev.preventDefault()并在使用$(“#new_player”)设置值后恢复了方法.unbind('submit')。submit()

$("#new_player").submit( function(ev) {

    ev.preventDefault();

    geocoder = new google.maps.Geocoder();
    var street = $("#player_street").val()
    var postalcode = $("#player_postalcode").val()
    var city = $("#player_city").val()
    var address = street + ", " + postalcode + ", " + city
    var lat
    var lng

    geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        lat = results[0].geometry.location.hb
        lng = results[0].geometry.location.ib
        $("#player_lat:hidden").val(lat)
        $("#player_lng:hidden").val(lng)

        $("#new_player").unbind('submit').submit()

      } else {
        alert("Dein Player konnte nicht eingetragen werden, bitte probiere es noch einmal.")
        return false
      }
    })
})