Ajax Get返回未定义

时间:2018-12-13 21:09:41

标签: javascript jquery html ruby-on-rails

我是Rails的初学者,我对如何解决此错误一无所知。我试图在我的JavaScript文件的get_info_from_iclass中调用rentals_controller方法。

$('document').ready(function () {

var iclass_field = document.getElementById("ic").getElementsByTagName("input")[0];
console.log(iclass_field == null);
let timeout;
iclass_field.addEventListener("input", () => {
clearTimeout(timeout);
 timeout = setTimeout(() => populateFields(iclass_field), 500);
  });

    function populateFields(iclass) {
      var temp = iclass.value;
      var studIC = parseInt(temp);
      $.ajax({
        type: "GET",
        url: "rentals/get_info_from_iclass",
        data: {studIC: studIC},
        dataType: 'text',
        async: false,
        success: function(data) {
          document.getElementById("fn").getElementsByTagName("input")[0].value = data.first_name;
          document.getElementById("ln").getElementsByTagName("input")[0].value = data.last_name;
          document.getElementById("em").getElementsByTagName("input")[0].value = data.email_address;
        },
            error: function(data) {
                alert("Fail");
            }
      });
  }
});

最终,我尝试使用在Controller中使用iclass进行的db查询返回的数据填充表单中的其他字段。以下是我要调用的控制器中的方法。

def get_info_from_iclass
   return User.where(iclass: params[:iclass]).last
  end

但是,无论我尝试什么,请求都返回未定义。通过搜索其他stackoverflow主题,我认为这可能与AJAX是异步的事实有关,而我必须对回调方法(???)做一些事情。同样,我对此很陌生,如果我提供的信息量足够多,我希望对发生的事情进行深入的解释。

编辑

我尝试使用回调函数,但是,我遇到了同样的问题,我的数据未定义。

  success: update_form,
  error: function(data) {
      alert("Fail");
    }
  });
function update_form(data){
document.getElementById("fn").getElementsByTagName("input")[0].value = data.first;
..etc....

这可能是我查询数据库的方式吗?还是我处理数据类型的方式?

1 个答案:

答案 0 :(得分:0)

您有多个错误:

  • iclass_field.addEventListener(“ keypress”,ignoreReturn(iclass_field));

    通过这种方式,您可以立即调用该函数,因为该函数会返回未定义状态,因此永远不会调用该处理程序。但是您再次在函数内部添加了处理程序。

  • 如果(键= 13){

    通过这种方式,您分配值13而不是测试值本身

  • 由于您对 \ n 不感兴趣,因此可以使用input事件来简化代码。

  • 将参数传递给jQuery get函数的正确方法是 {studIC:studIC}

此外,如果您有表单并且不想提交表单本身,则可以使用提交event来阻止它。

$('document').ready(function () {

    var iclass_field = document.getElementById("ic").getElementsByTagName("input")[0];
    iclass_field.addEventListener("input", function (e) {
        populateFields(iclass_field); // you may use the this keyword.....
    });


    function populateFields(iclass) {
        var temp = iclass.value;
        var studIC = parseInt(temp);
        $.get("rentals/get_info_from_iclass", {studIC: studIC}, function (data) {
            alert('Success');
        });
    }
});