2017-09-05 7 views
0

나는 stackoverflow에 이미 많은 질문이 있지만 그 중 아무 것도 유용하지 않다는 것을 알고있다.레일에서 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

당신은이 JSON 형식으로 아약스에 INFOR 필요한 돌아 render json: ...을 할 수 있습니다 : 좋아,

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 

그리고 아약스 기능의 성공에서 사용 :

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

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

여전히 오류가 발생합니다 : 잡히지 않은 SyntaxError : JSON의 위치 1에서 예상치 않은 토큰 o – Mark

+0

컨트롤러에'scheduled_task.id'의 값을 인쇄하고 인쇄 할 글을 게시 할 수 있습니까? – Abhi

+1

문제는 JSON을 두 번 파싱하고, 처음에는 렌더링시에 두 번째로 성공 함수에서 파싱했습니다. 데이터를 삭제 한 후 everythign은 완벽하게 작동합니다. 고맙습니다. – Mark

0

jQuery를successerror 콜백은 컨트롤러가 반환 한 상태 코드에 의존합니다. 개체를 만들거나 읽을 수 없거나 업데이트 할 수없는 경우 올바른 상태 코드를 반환해야합니다. 성공하면 id 속성을 설정하여 JSON을 렌더링하면됩니다. 당신이 (당신은 기본 골격 생성 방법에 의존 할 수 있습니다) 컨트롤러 코드의 구조를 개선 할 필요가

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

첫째 : 나는 update_attributes 반환 성공 true을 믿습니다. 당신이 JQuery와 아약스 요청의 성공과 실패 응답 방법을 수정해야합니다, 그리고

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 

: 그럼, 당신은 당신의 방법을 반환 할 대답이 같은으로 만 JSON 형식으로 응답 할 것을 표시해야 .

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

:

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

하면, 파일 설정/ruotes.rb이 메소드에 액세스하는 규칙을 추가하려면이 같은 뭔가가 필요 잊지 마세요 : 여기 보면하는 방법의 예 이게 너를 도왔 으면 좋겠다.