如何响应Rails中的ajax调用

问题描述:

我知道关于这个问题已经有很多问题了,但是没有一个对我有用。这里是我的Ajax代码:如何响应Rails中的ajax调用

function update_schedule($task){ 
    var taskId = $task.data("taskId"), 
    startHour, endHour, 
    userId = $('#users').val(); 
    if(!$task.hasClass('daily-task')){ 
    startHour = getStartHour($task), 
    endHour = startHour + (+$task.data('time')); 
    } 
    console.log(startHour, endHour) 

    $.ajax({ 
      url: '/heimdall/update_scheduled_task', 
      method: 'POST', 
      data: { "task_id": taskId, "start_hour": startHour, "end_hour": endHour, "user_id": userId }, 
      success: function(){ 
      console.log("SUCESS!!", data['head']) 
      }, 
      error: function() { 
       console.log("FAILURE"); 
      }, 
      async: true 
    }); 
} 

控制器代码:

def update_scheduled_task 
    scheduled_task = ScheduledTask.find_or_create_by(task_id: params[:task_id]) 
    scheduled_task.update_attributes(start_hour: params[:start_hour], end_hour: params[:end_hour], task_id: params[:task_id], user_id: params[:user_id]) 

    end 

我想返回找到或创建任务的ID。我不知道如何发送/接收这些信息。我已阅读有关回应,但我仍然不知道如何在这种情况下使用它。

你可以做render json: ...返回JSON格式所需的Infor阿贾克斯:

def update_scheduled_task 
    scheduled_task = ScheduledTask.find_or_create_by(task_id: params[:task_id]) 
    scheduled_task.update_attributes(start_hour: params[:start_hour], end_hour: params[:end_hour], task_id: params[:task_id], user_id: params[:user_id]) 

    render json: {scheduled_task_id: scheduled_task.id} 
end 

而在AJAX功能的成功,这样使用它:

success: function (data){ 
    var data = JSON.parse(data); 

    console.log(data["scheduled_task_id"]); 
}, 
+0

我仍然收到错误:未捕获SyntaxError:在位置1的JSON中出现意外的令牌o – Mark

+0

您可以在控制器中打印'scheduled_task.id'的值并发布要打印的内容吗? – Abhi

+1

问题在于解析为JSON两次,第一次呈现,第二次成功。删除数据解析后,everythign完美工作。谢谢。 – Mark

的jQuerysuccesserror回调依赖于控制器返回的状态码。确保在无法创建/读取/更新对象时返回正确的状态码。成功时,只需使用id属性集来呈现JSON即可。我beleive update_attributes回报true成功:

if scheduled_task && scheduled_task.update_attributes(...) 
    render json: { id: scheduled_task.id } 
else 
    head :unprocessable_entity 
end 

首先,你需要提高你的控制器代码结构(你可以依靠默认的脚手架发电机的方法)。然后,你必须表明你的方法将只JSON格式的回应,与要返回答案,是这样的:

def update_scheduled_task 
    scheduled_task = ScheduledTask.find_or_create_by(task_id: params[:task_id]) 
    if (scheduled_task && scheduled_task.update_attributes(start_hour: params[:start_hour], end_hour: params[:end_hour], task_id: params[:task_id], user_id: params[:user_id])) 
    render json: { scheduled_task_id: scheduled_task.id } 
    else 
    render json: { error: l18n.t("error.messages.request_error") } 
    end 
end 

然后,你必须修改的jQuery Ajax请求的成功和失败的响应方法。下面是它可能如何看一个例子:

$.ajax({ 
    url: "/heimdall/update_scheduled_task", 
    method: "post", 
    data: { task_id: taskId, start_hour: startHour, end_hour: endHour, user_id: userId }, 
    success: function(result) { 
    if (result["scheduled_task_id"] != null) { 
     console.log("Schedule record => " + result["scheduled_task_id"]) 
    } else { 
     console.log("Error: " + result["error"]) 
    } 
    }, 
    error: function() { 
    console.log("Ajax request error"); 
    }, 
    // async: true => By default JQuery set true to async param. 
}); 

不要忘记,你需要添加一个规则,在文件的config/ruotes.rb访问此方法是这样的:

post update_scheduled_task, :defaults => { :format => 'json' } 

我希望这有助于你,问候!