2

我知道在 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。我不知道如何发送/接收这些信息。我已经阅读了有关响应的信息,但在这种情况下我仍然不知道如何使用它。

4

3 回答 3

3

您可以render json: ...将所需的信息以 JSON 格式返回给 ajax:

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"]);
},
于 2017-09-05T14:11:05.657 回答
2

首先,您需要改进您的控制器代码结构(您可以依赖默认的脚手架生成器方法)。然后,您必须指出您的方法将仅响应 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' }

我希望这对你有帮助,问候!

于 2017-09-05T18:01:57.220 回答
0

jQuerysuccesserror回调依赖于控制器返回的状态码。当您无法创建/读取/更新对象时,请确保返回正确的状态代码。成功后,只需渲染一个带有 id 属性集的 JSON。我相信成功的update_attributes回报true

if scheduled_task && scheduled_task.update_attributes(...)
  render json: { id: scheduled_task.id }
else
  head :unprocessable_entity
end
于 2017-09-05T15:44:30.220 回答