可以't为表单中的隐藏字段设置值

Can't set value for hidden field in form

本文关键字:隐藏 字段 设置 表单 可以      更新时间:2023-09-26

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

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

这里有我的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()的返回值设置为false时,就会设置隐藏字段的值。但是当我将返回值设置为true时,数据库中没有任何条目。

字段在模型中设置和工作,函数可通过form_for助手的onsubmit方法访问。

有人知道怎么解决这个问题吗?

由于使用jQuery使用:hiddenjQuery选择器。

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

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

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;
})

为了防止该方法提交,我添加了ev.prventDefault(),并在用$("#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
      }
    })
})