2017-09-05 134 views
0

我知道關於這個問題已經有很多問題了,但是沒有一個對我有用。這裏是我的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。我不知道如何發送/接收這些信息。我已閱讀有關回應,但我仍然不知道如何在這種情況下使用它。

回答

2

你可以做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

0

的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 
1

首先,你需要提高你的控制器代碼結構(你可以依靠默認的腳手架發電機的方法)。然後,你必須表明你的方法將只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' } 

我希望這有助於你,問候!